2016-05-31 4 views
4

ストアドプロシージャでレコードを挿入しようとすると、異常な動作が発生します。 set serveroutput onとのみ対応します。Oracleプロシージャは、set serveroutput onの場合にのみ機能します。

ありがとうございました。

SQL*Plus: Release 11.2.0.1.0 Production on Tue May 31 22:48:25 2016 

Copyright (c) 1982, 2010, Oracle. All rights reserved. 


Connected to: 
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, 
Data Mining and Real Application Testing options 

SQL> exec abc_utils.abc_init(p_table_name => 'ABC_TEST', p_batch_alias => 'TST'); 
BEGIN abc_utils.abc_init(p_table_name => 'ABC_TEST', p_batch_alias => 'TST'); END; 

* 
ERROR at line 1: 
ORA-01422: exact fetch returns more than requested number of rows 
ORA-06512: at "TESTUSR.abc_utils", line 1743 
ORA-06512: at line 1 


SQL> set serveroutput on; 
SQL> exec abc_utils.abc_init(p_table_name => 'ABC_TEST', p_batch_alias => 'TST'); 

PL/SQL procedure successfully completed. 


    PROCEDURE abc_init(p_table_name IN VARCHAR2, 
          p_batch_alias IN VARCHAR2) IS 

    v_sql    VARCHAR2(32000); 

    --object caller variables 
    v_owner    VARCHAR2(30 CHAR); 
    v_obj_name   VARCHAR2(30 CHAR); 
    v_line_no   NUMBER; 
    v_caller_type  VARCHAR2(30 CHAR); 
    v_caller    VARCHAR2(4000 CHAR); 


    BEGIN 
    owa_util.who_called_me(v_owner, v_obj_name, v_line_no, v_caller_type); 
     v_caller := 'Object Name: ' || $$plsql_unit || '; Caller Name: ' || v_obj_name || '; Caller Line: ' || to_char(v_line_no); 

     --initialise summary table 
     v_sql := 'INSERT INTO INIT_SUMMARY (BATCH_ALIAS,TABLE_NAME,START_DT,BATCH_USER,BATCH_RUN) ' || 
       'SELECT a.BATCH_NAME,:1,:2,a.BATCH_USER,:3 FROM INIT_CFG a WHERE 1 = 1 AND BATCH_NAME = :4'; 

     EXECUTE IMMEDIATE v_sql USING p_table_name,SYSDATE,summary_seq.nextval,p_batch_alias; 
     COMMIT; 

     EXCEPTION 
      WHEN OTHERS THEN 
      gv_err_msg := substr('Back Trace: ' ,1,4000); 
      RAISE_APPLICATION_ERROR(-20001,'abc_init: ' || gv_err_msg); 
    END abc_init; 
    --******************************************************************** 
+1

私は、1743行がパッケージの初期化セクションにあることを期待しています。すべてのプロシージャと関数の後にパッケージ本体のbegin/endブロックです。これはセッションごとに1回しか実行されないので、2番目の呼び出しはそれに当たらず、serveroutputとは何も関係ありません。そのブロックはselect intoを実行しています。そのコードセクションを質問に追加してください。 –

+1

静的SQLが十分である場合、ここで動的SQLをなぜ使用していますか? –

答えて

3

エラーがpackage instantiationから来ている:

セッションは、パッケージアイテムを参照すると、Oracle Databaseは、そのセッション用のパッケージをインスタンス化します。パッケージを参照するすべてのセッションは、そのパッケージのインスタンス化を行います。

Oracle Databaseによってパッケージがインスタンス化されると、パッケージが初期化されます。初期設定が適用され、次のいずれかが含まれます。 ...

  • だけセッションごとに一度起こるinstatiationパッケージ本体

の初期化部分を実行します。プロシージャーへの最初の呼び出しで、初期化セクションが実行されます。 2番目の呼び出しは行いません。 set serveroutput onは効果がありません。それは動作する2番目の呼び出しであり、それはその初期化が2回目に呼び出されないためです。

パッケージの最後のendの前に、すべてのプロシージャや関数などの後にパッケージ本体の初期化部分からエラーが発生しています。すべてのプロシージャや関数などの後にはbeginがあります。以下のようなもの:

create or replace package body abc_utils as 
    ... 
    some_var number; -- package state variable 
    ... 
    procedure abc_init is 
    ... 
    begin 
    ... 
    end abc_init; 
    ... 
/* package initialisation */ 
begin 
    select some_col into some_var from some_table; -- line 1743 
end abc_utils; 
/

そのブロック内のコードは、ライン1743が含まれ、それは複数の行を見つけるさselect ... intoあろう。あなたはそのコードを表示していませんが、調査する必要があります。

+0

実際に、パッケージの最後に複数の行を戻すSelect intoがありました。どうもありがとう。 –

関連する問題