当我运行以下查询时,它在第二个查询中失败,因为没有定义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';
答案 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语句可以插入主表和第二个表(例如全局临时表)。然后,您可以查询全局临时表以查看插入的行。