0

谁能帮我找出错误。

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

谢谢

4

1 回答 1

0

直接错误是AGG_COLUMNS在第一个嵌套的 PL/SQL 块中声明了局部变量。这意味着一旦第一个嵌套块完成,它就超出了范围。因此,您不能在第二个嵌套的 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.
于 2013-03-21T14:00:29.330 回答