sql >> データベース >  >> RDS >> Oracle

SQL 以外の型で即時実行

    「回避策」の意味によって異なります。型は、PL/SQL ブロック (この場合はおそらくパッケージ) 内ではなく、SQL レベルで宣言する必要があります。たとえば、これはうまくいきます:

    CREATE OR REPLACE TYPE t_error_msgs AS TABLE OF VARCHAR2(2000)
    /
    
    CREATE OR REPLACE PACKAGE p42 AS
      FUNCTION handler RETURN t_error_msgs;
    END p42;
    /
    
    CREATE OR REPLACE PACKAGE BODY p42 AS
      FUNCTION handler RETURN t_error_msgs IS
      BEGIN
        RETURN null; -- put real data here, obviously...
      END handler;
    END p42;
    /
    
    DECLARE
      v_error_msg t_error_msgs;
      v_function varchar2(30);
    BEGIN
      v_function := 'p42.handler';
      EXECUTE IMMEDIATE 'BEGIN :result := ' || v_function || '; END;'
        USING OUT v_error_msg;
    END;
    /
      

    または、これを動的にする必要があるかどうかを再検討することもできます。おそらく、その場で呼び出す関数を渡しているか、何らかの方法で決定し、 v_function にデータを入力しています .可能な値のリストが比較的短い場合は、 case を使用する方が簡単かもしれません 個々の静的関数呼び出しを使用します。




    1. ユーザーを作成するためのMySQLストアドプロシージャ

    2. MySQL-複雑な計算のUPDATEクエリパフォーマンスを改善

    3. 隠しフィールドデータはMysqlに挿入されていません

    4. 任意のIPアドレスからのMySQLデータベースへのリモートアクセスを許可する