执行立即

时间:2013-03-21 13:49:20

标签: oracle11g

任何人都可以帮我找出错误。

create or replace procedure sample
is
begin
  DECLARE AGG_COLUMNS VARCHAR2(2000);
      BEGIN
        EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS;
      END;
begin
    EXECUTE IMMEDIATE      
      'CREATE TABLE NEW_BW_COLUMN_ROW_CELL_JOIN AS
      (
          SELECT *
          FROM BW_COLUMN_ROW_CELL_JOIN
          PIVOT
          (
            MAX(STRING_VALUE)
            FOR COLUMN_NAME IN ('||AGG_COLUMNS||')))';
  END;
end;

Error(9,5): PL/SQL: Statement ignored

Error(17,36): PLS-00201: identifier 'AGG_COLUMNS' must be declared

由于

1 个答案:

答案 0 :(得分:0)

立即错误是在第一个嵌套的PL / SQL块中声明了局部变量AGG_COLUMNS。这意味着只要第一个嵌套块完成,它就会超出范围。因此,您不能在第二个嵌套的PL / SQL块中使用它。您可以通过在过程的声明部分中声明局部变量来解决此问题。您还可以摆脱嵌套的PL / SQL块

create or replace procedure sample
is
  AGG_COLUMNS VARCHAR2(2000);
begin
  EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS;
  EXECUTE IMMEDIATE      
      'CREATE TABLE NEW_BW_COLUMN_ROW_CELL_JOIN AS
      (
          SELECT *
          FROM BW_COLUMN_ROW_CELL_JOIN
          PIVOT
          (
            MAX(STRING_VALUE)
            FOR COLUMN_NAME IN ('||AGG_COLUMNS||')))';
end;

这应该删除立即编译错误。不过,我不确定这是否可以解决你所有的问题。

  • COLUMN_NAMES不是默认Oracle安装中的表。这必须是您为了运行此代码而创建的内容。
  • 如果您确实创建了COLUMN_NAMES表,并且COLUMNS存储了逗号分隔的字符串,则无需使用动态SQL来查询表。你可以做一个简单的SELECT ... INTO