Что касается замены SQL - PullRequest
1 голос
/ 02 июля 2010

Когда я запустил приведенные ниже запросы, во втором запросе произошел сбой, поскольку переменная prev_test_ref1 не определена. Если я удаляю оператор вставки в первом запросе, запускаю снова, тогда он работает и использует значение prev_test_ref1 из первого запроса sql во втором запросе. Это из-за переменной области? Как я могу решить это с помощью оператора вставки.

QUERY1

column prev_test_ref1 new_value prev_test_ref1  ;

insert into testing.test_ref_details(TEST_TYPE,TEST_REF_NO)
select  '1',max(test_ref_no) as prev_test_ref1
from    testing.test_runs_status
where   test_type = 1
and run_status = 1
and test_end_dt = (select last_day(add_months(trunc(sysdate),-6))+2 from dual)
group by test_end_dt
;

QUERY2

column last_test_end_dt new_value last_test_end_dt;

select to_char(test_completion_dt,'DD-MON-YYYY HH24:MI:SS') as last_test_end_dt
from testing.test_runs_status
where test_ref_no = '&prev_test_ref1';

Ответы [ 4 ]

1 голос
/ 02 июля 2010

В SQL переменные подстановки Plus будут определены только с помощью операторов SELECT. Ваша первая вставка не возвращает строки, поэтому она не будет работать (подумайте об этом: она возвращает только 1 row inserted., SQL Plus не может узнать вставленное значение.)

Я предлагаю вам добавить шаг для сохранения значения в переменную (или использовать блок PL / SQL):

column prev_test_ref1 new_value prev_test_ref1  ;

SELECT MAX(test_ref_no) AS prev_test_ref1
  FROM testing.test_runs_status
 WHERE test_type = 1
   AND run_status = 1
   AND test_end_dt = (SELECT last_day(add_months(trunc(SYSDATE), -6)) + 2 
                        FROM dual)
 GROUP BY test_end_dt;

 INSERT INTO testing.test_ref_details(TEST_TYPE,TEST_REF_NO) 
    VALUES ('1', &prev_test_ref1);

 SELECT ...
0 голосов
/ 03 июля 2010

Не совсем понятно, какова цель всего сценария, особенно в свете комментария: «У меня похожий SQL-запрос, который возвращает несколько строк. В этом случае у меня не может быть отдельного оператора вставки».

Если вы хотите использовать результаты выбора, посмотрите, соответствует ли Вставка в несколько таблиц .Ваш оператор выбора может быть вставлен как в основную таблицу, так и во вторую таблицу (например, глобальную временную таблицу).Затем вы можете запросить глобальную временную таблицу, чтобы увидеть, какие строки были вставлены.

0 голосов
/ 02 июля 2010

Оператор INSERT содержит предложение RETURNING.Мы можем использовать это, чтобы получить доступ к «неизвестным» значениям из таблицы.В следующих примерах RETURNING используется для получения назначенного nextval из последовательности, но мы можем вернуть любой столбец из строки:

SQL> var prev_id number
SQL> insert into t23 (id, name) values (my_seq.nextval, 'MAISIE')
  2  returning id into :prev_id
  3  /

1 row created.

SQL> select * from t23
  2  where id = :prev_id
  3  /

NAME               ID
---------- ----------
MAISIE            122

SQL> 

К сожалению, предложение RETURNING работает только с однострочным SQL.

0 голосов
/ 02 июля 2010
declare
prev_test_ref1 number(10);
begin
  insert into ...select ...;
  select ... into prev_test_ref1 from ...;
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...