所以我有这样的陈述:
execute immediate 'SELECT count(*) INTO counter FROM (SELECT table_a.NUMBERWANG FROM table_a MINUS SELECT table_b.NUMBERWANG FROM table_b )';
但是,如果我尝试将其中一个值变为变量,则该语句似乎不再起作用。
如果尝试
execute immediate 'SELECT count(*) INTO counter FROM (SELECT table_a.NUMBERWANG FROM table_a MINUS SELECT table_b.NUMBERWANG FROM ' || variable_1 || ' )';
我收到了丢失的关键字错误。
如果它变得不寻常,如果我删除“INTO COUNTER”它会运行。
我的INTO位置是错误的还是完全不同的?
答案 0 :(得分:1)
您在执行的字符串中不能有into clause
。
您需要将其移出字符串并告诉execute immediate
执行此操作:
declare
l_count integer;
l_sql varchar(4000);
begin
l_sql := 'SELECT count(*) FROM (SELECT table_a.NUMBERWANG FROM table_a MINUS SELECT table_b.NUMBERWANG FROM table_b )';
execute immediate l_sql into l_count;
end;
/
答案 1 :(得分:0)
我认为你不能动态执行SELECT...INTO...
。当我尝试这个时:
DECLARE
counter NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) INTO COUNTER FROM TEST_TABLE';
DBMS_OUTPUT.PUT_LINE('COUNTER=' || COUNTER);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
我得到ORA-00905: missing keyword
。我可以通过删除INTO
子句来消除错误,但当然我仍然没有得到counter
的值。
如果要动态执行此类语句并能够将值检索到变量中,则需要使用游标,如:
DECLARE
counter NUMBER;
c SYS_REFCURSOR;
BEGIN
OPEN c FOR 'SELECT COUNT(*) FROM TEST_TABLE';
FETCH c INTO counter;
CLOSE c;
DBMS_OUTPUT.PUT_LINE('COUNTER=' || COUNTER);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
分享并享受。