2016-03-22 1 views
-2

PL/SQLからこの問合せをコールするときにORA-06502エラーが発生します。 しかし、SQLプロンプトから試してみるとうまくいきます。ORA-06502:スタンドアロンSQLで動作する問合せ

SQLから、これが予想される出力できますプロンプト:

SELECT * 
    FROM 
    (
    SELECT 
     COL.BAN, 
     MAX (COL.COL_ACTV_CODE) AS COL_ACTV_CODE, 
     MAX (TO_CHAR(COL.COL_ACTV_DATE,'MM')) AS COL_ACTV_DATE 
    FROM 
     COLLECTION    COL, 
     COLLECTION_ACTIVITIES CAC 
    WHERE (CAC.SEVERITY_LEVEL , TO_CHAR(COL.COL_ACTV_DATE,'YYYYMM')) IN 
     (SELECT 
       MAX(CAC.SEVERITY_LEVEL), 
       MAX(TO_CHAR(COL.COL_ACTV_DATE, 'YYYYMM')) 
      FROM 
       COLLECTION    COL, 
       COLLECTION_ACTIVITIES CAC 
      WHERE 
       COL.COL_ACTV_CODE = CAC.COL_ACTIVITY_CODE 
      GROUP BY TO_CHAR (COL.COL_ACTV_DATE , 'YYYYMM') 
     ) 
    GROUP BY COL.BAN 
    ORDER BY TO_CHAR (COL.COL_ACTV_DATE , 'YYYYMM') DESC 
    ) 
    PIVOT 
    (
     MAX(COL_ACTV_CODE) 
    FOR COL_ACTV_DATE in ('01' as "JAN", '02' as "FEB", '03' as "MAR")); 

     BAN J F M A M J J A S O N D 
---------- - - - - - - - - - - - - 
    90314228     W 
    90314009  K 
    90314748      E 
    90314568     E 
    90314328     W 

しかし、PL/SQLからの:

BEGIN 

STMT_STR := 'CREATE TABLE ACD_COL_ST 
      PCTUSED 90 
      NOLOGGING 
      AS 
SELECT * 
    FROM 
    (
    SELECT 
     COL.BAN, 
     MAX (COL.COL_ACTV_CODE) AS COL_ACTV_CODE, 
     MAX (TO_CHAR(COL.COL_ACTV_DATE,'MM')) AS COL_ACTV_DATE 
    FROM 
     COLLECTION    COL, 
     COLLECTION_ACTIVITIES CAC 
    WHERE (CAC.SEVERITY_LEVEL , TO_CHAR(COL.COL_ACTV_DATE,'YYYYMM')) IN 
     (SELECT 
       MAX(CAC.SEVERITY_LEVEL), 
       MAX(TO_CHAR(COL.COL_ACTV_DATE, 'YYYYMM')) 
      FROM 
       COLLECTION    COL, 
       COLLECTION_ACTIVITIES CAC 
      WHERE 
       COL.COL_ACTV_CODE = CAC.COL_ACTIVITY_CODE 
      GROUP BY TO_CHAR (COL.COL_ACTV_DATE , 'YYYYMM') 
     ) 
    GROUP BY COL.BAN 
    ORDER BY TO_CHAR (COL.COL_ACTV_DATE , 'YYYYMM') DESC 
    ) 
    PIVOT 
    (
     MAX(COL_ACTV_CODE) 
    FOR COL_ACTV_DATE in ('01' as "JAN", '02' as "FEB", '03' as "MAR"))'; 

EXECUTE IMMEDIATE STMT_STR; 

EXCEPTION WHEN OTHERS THEN 
DBMS_OUTPUT.PUT_LINE('An error was encountered creating table ACD_COL_ST'||SQLCODE||' - ERROR - '||SQLERRM); 
END; 
COMMIT; 

私はエラーを取得する:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

+0

「&1」に対するクエリに入力した入力は何ですか?そしてあなたはまだあなたのPLエラーを取得する小さなクエリを簡素化することができますか? –

+0

これについては本当にわかりませんが、あなたは '&1'を':1'に変更しようとしましたか? &は置換変数のためのSQL * Plusの機能です。あなたの問題を解決するかどうかはわかりませんが、PL/SQLでの使用は控えてください。 – brenners1302

+0

質問が簡単なクエリで更新されました – user2802527

答えて

0

私はちょうどチェックコード。私たちが答える前に、動的SQLを使用して実行時にテーブルを作成する理由を教えてください。最初にテーブルを作成してから、SIMPLER SQLを使用してPLSQLにINSERTすることはできません。とにかく私はあなたのコードでは、文字列のためだけに単一引用符があることがわかります。動的クエリでは '' for ''を使用する必要があります。以下のクエリを参照してください私は今私と仕事スペースを持っていないので、クエリを検証することはできません。任意の構文上の誤りを許してください。

DECLARE 
STMT_STR LONG; 
BEGIN 
STMT_STR := 
     'CREATE TABLE ACD_COL_ST       
     AS 
     SELECT * 
     FROM 
     ( 
     SELECT  
     COL.BAN,  
     MAX (COL.COL_ACTV_CODE) AS COL_ACTV_CODE,  
     MAX (TO_CHAR(COL.COL_ACTV_DATE,''MM'')) AS COL_ACTV_DATE 
     FROM  
     COLLECTION    COL,  
     COLLECTION_ACTIVITIES CAC 
     WHERE (CAC.SEVERITY_LEVEL , TO_CHAR(COL.COL_ACTV_DATE,''YYYYMM'')) IN   
     (SELECT    
     MAX(CAC.SEVERITY_LEVEL),    
     MAX(TO_CHAR(COL.COL_ACTV_DATE, ''YYYYMM''))   
     FROM    
     COLLECTION    COL,    
     COLLECTION_ACTIVITIES CAC   
     WHERE    
     COL.COL_ACTV_CODE = CAC.COL_ACTIVITY_CODE   
     GROUP BY TO_CHAR (COL.COL_ACTV_DATE , ''YYYYMM'')   
     )  
     GROUP BY COL.BAN  
     ORDER BY TO_CHAR (COL.COL_ACTV_DATE , ''YYYYMM'') DESC  
     )  
     PIVOT  
     (  
     MAX(COL_ACTV_CODE)  
     FOR COL_ACTV_DATE in (''01'' as JAN, ''02'' as FEB, ''03'' as MAR))'; 
    EXECUTE IMMEDIATE STMT_STR; 
EXCEPTION 
WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('An error was encountered creating table ACD_COL_ST'||SQLCODE||' - ERROR - '||SQLERRM); 
END; 
+0

LONGの使用は廃止されました。とにかくCLOBを使用する必要がありますが、これに対して問合せはVARCHAR2に適合します。私は、エスケープされた引用符は赤いニシンであると思う、OPはちょうど既存のSQLステートメントの周りの質問にPL/SQLのビットを追加しました。彼らは引用符をエスケープするより簡単な代替の引用メカニズムを使用している可能性があります。 –

+0

はい、多分このシナリオで動的SQLが見つからない場合には、問題になります –

+0

しかし、そのエラーは発生しません。もちろんそれに言及することを傷つけません。 –

関連する問題