关于sql替换

时间:2010-07-02 06:18:36

标签: sql oracle plsql

当我运行以下查询时,它在第二个查询中失败,因为没有定义prev_test_ref1变量。如果我在第一个查询中删除insert语句,再次运行然后它正在工作并使用第二个查询中第一个sql查询的prev_test_ref1值。是因为范围可变吗?如何使用insert语句解决此问题。

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 个答案:

答案 0 :(得分:1)

在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 ...

答案 1 :(得分:0)

declare
prev_test_ref1 number(10);
begin
  insert into ...select ...;
  select ... into prev_test_ref1 from ...;
end;
/

答案 2 :(得分:0)

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。

答案 3 :(得分:0)

目前还不清楚整个脚本的用途是什么,特别是根据评论“我有类似的sql查询返回多行。在这种情况下,我不能有单独的插入语句。”

如果您想使用选择的结果,请查看Multi-Table Inserts是否适合该帐单。您的select语句可以插入主表和第二个表(例如全局临时表)。然后,您可以查询全局临时表以查看插入的行。