TOAD ORACLEを使用してDEFパッケージで定義されたSQL関数ABCを呼び出す方法

私は1つの文字列引数を受け入れるABCという名前の中に1つの関数を持つDEFというOracleパッケージを持っています。 TOADエディタでこの関数ABCを直接呼び出す方法を知ってもいいですか?

前もって感謝します。

CREATE OR REPLACE PACKAGE HPQ_IF.def AS
  FUNCTION def(p_sql IN VARCHAR2)
  RETURN VARCHAR2;
END def;
/


  FUNCTION abc(p_sql IN VARCHAR2)
  RETURN VARCHAR2
  IS
  j NUMBER;

  BEGIN
    dbms_output.put_line(p_sql);
    RETURN 'Done';
  END abc;

最後のエラー(以下の最初の答えを使用):

[Error] Execution (6: 31): ORA-06550: line 6, column 31:
PLS-00302: component 'abc' must be declared
ORA-06550: line 6, column 3:
PL/SQL: Statement ignored
2
関数とパッケージ名を変更したようです。しかし、私はあなたが間違いを犯したと思う。この関数は、本体だけでなく宣言でも、 abc という名前で呼び出す必要があります。フルパッケージヘッダとフルパッケージボディを投稿してください。名前を変更する場合は、ヘッダーと本文の両方が正常にコンパイルされるように、最初にすべてのエラーを修正します。
追加された 著者 Codo,

2 答え

TOAD SQLバッファー内:

DECLARE
   v_sql VARCHAR2(255);
   v_return VARCHAR2(255);
BEGIN
   v_sql := 'the string'; -- or get it from anywhere else
   v_return := HPQ_IF.def.abc(v_sql);
   dbms_output.put_line(v_return);
   -- do anything else you want to do with the return value here...
END;

情報を表示する以外の戻り値で何もしたくない場合は、次のようにします。

SELECT HPQ_IF.def.abc('the string') FROM DUAL;

ただし、PL/SQLファンクションをSQL(SELECT、INSERTなど)で呼び出すには、特定の副作用がない(データベース内の特定の種類の状態を変更できない)必要があります。 SELECTの列として呼び出すには、データベースの変更(たとえば、挿入または更新)、DDLの実行、またはトランザクションのコミットを行わないでください。


また、スキーマブラウザ内からプロシージャを実行することもできます。

4
追加された
def.abcのコードを投稿してください。 defパッケージ仕様でabcを利用できますか?
追加された 著者 Scott A,
あなたが投稿したことによると、それがtypoでない限り、パッケージのdefにpublic function abcはありません。
追加された 著者 Scott A,
@ iwan構文を整理し、もう少し説明を加えました。それは関数なので値を返さなければならないことに注意してください。
追加された 著者 Scott A,
ORA-06550:行6、列31:PLS-00302:コンポーネント 'abc'を宣言する必要がありますORA-06550:行6、列3 :PL/SQL:ステートメントが無視されました
追加された 著者 iwan,
こんにちはScott、私はパッケージヘッダーとその本体の上に投稿しました。テストでも同じスキーマHPQ_IFを使用したことに注意してください
追加された 著者 iwan,
ありがとう、私は答えとして受け入れている:)
追加された 著者 iwan,

関数は値を返しますので、結果をどこかに返さなければなりません。

SQL文から関数を呼び出すことができます

SELECT def.abc( 'Some string' )
  FROM dual;

または、結果をPL/sQLのローカル変数に戻すこともできます

DECLARE
  l_result VARCHAR2(100);
BEGIN
  l_result := def.abc( 'Some string' );
END;
3
追加された