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 ブロックでローカル変数が宣言されていることです。つまり、最初のネストされたブロックが完了するとすぐに範囲外になります。したがって、2 番目にネストされた 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 に答える