2

pl/sql レコード タイプをプロシージャに渡す方法:

CREATE OR REPLACE PACKAGE BODY PKGDeleteNumber
AS
 PROCEDURE deleteNumber (
    list_of_numbers  IN List_Numbers
 )
 IS
   i_write VARCHAR2(5);
 BEGIN
   --do something
 END deleteNumber;

END PKGDeleteNumber;
/

この手順では、レコード タイプである をdeleteNumber使用しました。List_Numbers同じパッケージ宣言は次のとおりです。

CREATE OR REPLACE PACKAGE PKGDeleteNumber
AS
   TYPE List_Numbers IS RECORD (
     IID NUMBER
   );
  TYPE list_of_numbers IS TABLE OF List_Numbers;
  PROCEDURE deleteNumber (
    list_of_numbers  IN List_Numbers
  );
END PKGDeleteNumber;

deleteNumber値のリストを渡す手順を実行する必要があります。テーブルに数値を挿入temp_testし、カーソル U を使用してデータを取得しました。

   SELECT *
     BULK COLLECT INTO test1
     FROM temp_test;

今、私が使用しているプロシージャを呼び出すために

execute immediate  'begin PKGDELETENUMBER.DELETENUMBER(:1); end;' 
  using test1;

他にも多くのことを試しました(for loopdbms_binding、など)。pl/sql レコード タイプを引数としてプロシージャに渡すにはどうすればよいですか?

編集:

基本的に、ネイティブの動的SQLのみを使用して、数値のリストを渡したい...

テーブル temp_test defn を追加します (インデックスまたは制約なし):

create table test_temp ( 
   IID number
);

insert次に、通常のステートメントを使用して 1,2,3,4,5 を挿入します。

このソリューションについては、

In a package testproc
CREATE TYPE num_tab_t IS TABLE OF NUMBER;

CREATE OR REPLACE PROCEDURE my_dyn_proc_test (p_num_array IN num_tab_t) AS
BEGIN
  dbms_output.put_line(p_num_array.COUNT);
END;
/

これは、SQL プロンプト/toad DECLARE v_tab testproc.num_tab_t := testproc.num_tab_t(1, 10); から呼び出されます。BEGIN EXECUTE IMMEDIATE 'BEGIN testproc.my_dyn_proc_test(:1); 終わり;' v_tab を使用します。終わり;

これは機能しません。エラーが表示されます。ワークステーションにいないため、現在問題を再現できません。

4

2 に答える 2

1

ステートメントの句でRECORD型を使用することはできません。数値のリストを渡したいだけなら、タイプの変数を使用しないのはなぜですか? 以下の例を確認してください。USINGEXECUTE IMMEDIATETABLE OF NUMBER

CREATE TYPE num_tab_t IS TABLE OF NUMBER;

CREATE OR REPLACE PROCEDURE my_dyn_proc_test (p_num_array IN num_tab_t) AS
BEGIN
  dbms_output.put_line(p_num_array.COUNT);
END;
/

DECLARE
  v_tab num_tab_t := num_tab_t(1, 10);
BEGIN
  EXECUTE IMMEDIATE 'BEGIN my_dyn_proc_test(:1); END;' USING v_tab;
END;

出力:

2

編集

これを試して:

CREATE TYPE num_tab_t IS TABLE OF NUMBER;

CREATE OR REPLACE PACKAGE testproc AS
  PROCEDURE my_dyn_proc_test (p_num_array IN num_tab_t);
END;
/

CREATE OR REPLACE PACKAGE BODY testproc AS
  PROCEDURE my_dyn_proc_test (p_num_array IN num_tab_t) AS
  BEGIN
    dbms_output.put_line(p_num_array.COUNT);
  END;
END;
/

DECLARE
  v_tab num_tab_t := num_tab_t(1, 10);
BEGIN
  EXECUTE IMMEDIATE 'BEGIN testproc.my_dyn_proc_test(:1); END;' USING v_tab;
END;
于 2013-10-28T14:17:23.687 に答える
0

オブジェクト型を使用します。オブジェクトタイプはすべてのパッケージに表示されます

于 2016-09-02T13:27:08.877 に答える