発生しているエラーを投稿することは常に役に立ちます。そうすれば、推測する必要はありません。私が見ることができるエラー...
まず、パッケージで型を宣言する必要はありません。すでに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