-1

パッケージストアプロシージャaccaptearray(table)パラメータを使用していますが、関連する質問が表示されます。必要なパッケージ例のOracleストアドプロシージャaccept array(table)パラメータ。storeprocedurを作成してもエラーは発生しませんが、呼び出すと、いくつかのエラーです。これがストアドプロシージャです。

CREATE OR REPLACE TYPE t_table IS TABLE of VARCHAR2(255);
    /
    CREATE OR REPLACE PACKAGE simon_pkg IS
        TYPE t_table IS TABLE of VARCHAR2(255);
        TYPE c_cursor IS ref CURSOR;
        PROCEDURE f (t_input in t_table,c_out out c_cursor);
    END;
    /
    CREATE OR REPLACE PACKAGE BODY simon_pkg IS
        PROCEDURE f (t_input in t_table,c_out out c_cursor) IS
            v_cursor c_cursor;
        BEGIN
            OPEN v_cursor FOR
                SELECT last_name
                FROM employees
                WHERE last_name IN
                    (SELECT * FROM TABLE(t_input));
            c_out := v_cursor;
        END f;
    END;
    /

これは私がそれを呼ぶときに私がしていることです:

DECLARE
    TYPE c_cur IS REF CURSOR;
    c_result c_cur;
    m_table t_table := t_table();
BEGIN
    m_table.EXTEND(2);
    m_table(1) := 'Urman';
    m_table(2) := 'Vargas';
    simon_pkg.f(m_table,c_result);
    SELECT * FROM TABLE(c_result);
END;
/

助けを待っています!お願いします。

4

1 に答える 1

2

発生しているエラーを投稿することは常に役に立ちます。そうすれば、推測する必要はありません。私が見ることができるエラー...

まず、パッケージで型を宣言する必要はありません。すでにSQLタイプを定義しています

CREATE OR REPLACE TYPE t_table IS TABLE of VARCHAR2(255);
/

パッケージ宣言では、同じ名前の別のPL/SQLタイプを宣言しないでください。与えられた参照が2つのタイプのどちらを使用しているかを把握する必要があるため、これはあなたの人生をより困難にするだけですt_table。パッケージ宣言では、弱参照カーソルの型を宣言する必要もありません。Oracleはすでにsys_refcursor型を提供しています。したがって、パッケージの仕様は次のようにする必要があります。

CREATE OR REPLACE PACKAGE simon_pkg 
IS
    PROCEDURE f (t_input in t_table,
                 c_out out sys_refcursor);
END;
/

それはあなたのパッケージ本体ができることを意味します

 CREATE OR REPLACE PACKAGE BODY simon_pkg IS
    PROCEDURE f (t_input in t_table,
                 c_out  out sys_refcursor) 
    IS
    BEGIN
        OPEN c_out FOR
            SELECT last_name
            FROM employees
            WHERE last_name IN
                (SELECT * FROM TABLE(t_input));
    END f;
END;

プロシージャの呼び出しは、実行しようとしていることに応じて、いくつかの異なる方法で実行できます。カーソルを繰り返して出力をバッファに書き込むコードを記述できますdbms_output(使用しているツールがバッファから読み取って出力を表示する方法を知っていると仮定します)。

DECLARE
    c_result sys_refcursor;
    m_table t_table := t_table();
    l_last_name varchar2(100);
BEGIN
    m_table.EXTEND(2);
    m_table(1) := 'Urman';
    m_table(2) := 'Vargas';
    simon_pkg.f(m_table,c_result);

    LOOP
      FETCH c_result INTO l_last_name;
      EXIT WHEN c_result%notfound;
      dbms_output.put_line( l_last_name );
    END LOOP;
    CLOSE c_result;
END;
/

SQL * Plus(またはSQL * Plus変数を実装する他のもの)を使用している場合

VARIABLE rc refcursor;

DECLARE
    m_table t_table := t_table();
BEGIN
    m_table.EXTEND(2);
    m_table(1) := 'Urman';
    m_table(2) := 'Vargas';
    simon_pkg.f(m_table,:rc);
END;

PRINT rc;

SQL * Plusとスキーマを使用していると仮定するとHR、最初のオプションからの出力を確認できます。

SQL> CREATE OR REPLACE TYPE t_table IS TABLE of VARCHAR2(255);
  2  /

Type created.

SQL> CREATE OR REPLACE PACKAGE simon_pkg
  2  IS
  3      PROCEDURE f (t_input in t_table,
  4                   c_out out sys_refcursor);
  5  END;
  6  /

Package created.

SQL>  CREATE OR REPLACE PACKAGE BODY simon_pkg IS
  2      PROCEDURE f (t_input in t_table,
  3                   c_out  out sys_refcursor)
  4      IS
  5      BEGIN
  6          OPEN c_out FOR
  7              SELECT last_name
  8              FROM employees
  9              WHERE last_name IN
 10                  (SELECT * FROM TABLE(t_input));
 11      END f;
 12  END;
 13  /

Package body created.

SQL> set serveroutput on;
SQL> DECLARE
  2      c_result sys_refcursor;
  3      m_table t_table := t_table();
  4      l_last_name varchar2(100);
  5  BEGIN
  6      m_table.EXTEND(2);
  7      m_table(1) := 'Urman';
  8      m_table(2) := 'Vargas';
  9      simon_pkg.f(m_table,c_result);
 10
 11      LOOP
 12        FETCH c_result INTO l_last_name;
 13        EXIT WHEN c_result%notfound;
 14        dbms_output.put_line( l_last_name );
 15      END LOOP;
 16      CLOSE c_result;
 17  END;
 18  /
Urman
Vargas

PL/SQL procedure successfully completed.

そして2番目のオプションからの出力

SQL> VARIABLE rc refcursor;
SQL> DECLARE
  2      m_table t_table := t_table();
  3  BEGIN
  4      m_table.EXTEND(2);
  5      m_table(1) := 'Urman';
  6      m_table(2) := 'Vargas';
  7      simon_pkg.f(m_table,:rc);
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL> PRINT rc;

LAST_NAME
-------------------------
Urman
Vargas
于 2012-07-11T18:59:01.687 に答える