select语句不使用变量,但使用固定值

时间:2014-07-23 15:12:53

标签: sql oracle plsql

所以我有这样的陈述:

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位置是错误的还是完全不同的?

2 个答案:

答案 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;

分享并享受。