EXECUTE IMMEDIATE SELECT INTO 语句中缺少关键字 - Oracle PL/SQL

Missing Keyword in EXECUTE IMMEDIATE SELECT INTO Statement - Oracle PL/SQL

下面的查询是 PL/SQL 我正在尝试 运行 的简化版本,它只显示了一般结构。简而言之,我试图从 SPECIAL_TABLE 中提取信息到变量 c, d.

DECLARE
  c NUMBER;
  d NUMBER;
BEGIN
  FOR all_tab IN
  (SELECT * FROM all_tables)
  LOOP
    BEGIN
      EXECUTE IMMEDIATE 'SELECT a, d INTO c, d
      FROM ' || :name || '.SPECIAL_TABLE WHERE name = '''
      :name || ''' AND table_name = ''' || all_tab.table_name || ''';

    ...

    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('ERROR OCCURRED');
    END;
END;

上面的查询不起作用(上面的查询我的意思是 EXECUTE IMMEDIATE),Oracle 声明 905 missing keyword。据我所知,遵循流程 here。请注意,''' 是为了让我可以为 SELECT 语句转义单个 ',然后一起完成整个字符串。奇怪的是,我可以按照下面的代码 运行 没有错误:

DECLARE
  c NUMBER;
  d NUMBER;
BEGIN
  FOR all_tab IN
  (SELECT * FROM all_tables)
  LOOP
    BEGIN
      EXECUTE IMMEDIATE 'SELECT COUNT(*)
      FROM ' || :name || '.SPECIAL_TABLE WHERE name = '''
      :name || ''' AND table_name = ''' || all_tab.table_name || ''' INTO c;

    ...

    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('ERROR OCCURRED');
    END;
END;

唯一改变的是我正在使用 MAX(...),并且似乎不再遵循上述超链接中指定的语法。我不确定语法部分以及它为什么有效,并且 MAX(...) 将确保仅 returning 一行。这似乎是问题的根源,但是当我自己执行 SELECT 查询时,它只 return 一个 单行 指定了两列. table 的主键是 PRIMARY KEY (a, b),所以它不应该 return 超过一行。

我在这里遗漏了什么以及如何让我的初始语句工作以将查询结果分配给 Oracle 11g 中的多个变量?

您提供的 link 用于 SELECT INTO 语句。使用 EXECUTE IMMEDIATE 选择变量时,您必须遵守 EXECUTE IMMEDIATE 的规则。

所以不是这个:

EXECUTE IMMEDIATE 'SELECT x FROM myTable INTO y';
                                         ^ Incorrect: INTO is inside the string

你必须这样做:

EXECUTE IMMEDIATE 'SELECT x FROM myTable' INTO y;
                                          ^ Correct: INTO is an EXECUTE IMMEDIATE keyword

您的查询应该是这样的:

EXECUTE IMMEDIATE 'SELECT a, d '
  || 'FROM ' || :name || '.SPECIAL_TABLE '
  || 'WHERE name = ''' || :name || ''' AND table_name = ''' || all_tab.table_name || ''''
INTO c, d;