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

Oracleストアド関数-パラメータとしてテーブル名を渡します

    1. スペースがあります FROMキーワードの後にありません EXECUTEIMMEDIATEステートメント内。
    2. すぐに実行 ステートメントに構文エラーがあります 。 INTOがありません 句。
    3. CURSOR FOR LOOP内でEXECUTEIMMEDIATEを使用することはできません。 。基本的に、あなたは何も返さない 上記のポイント2で説明したexecuteimmediateステートメントから。
    4. 反復構文 LOOPの場合 正しくありません。構文はFOR r IN 1..COUNT()です。 。

    コードを修正すると、次のようになります。

    SQL> CREATE OR REPLACE TYPE TES_JML_OBJ IS OBJECT(JUMLAH NUMBER)
      2  /
    
    Type created.
    
    SQL> CREATE OR REPLACE TYPE TES_JML_TABLE IS TABLE OF TES_JML_OBJ
      2  /
    
    Type created.
    
    SQL> CREATE OR REPLACE
      2    FUNCTION jumlahBaris(
      3        namatabel VARCHAR2)
      4      RETURN tes_jml_table
      5    IS
      6      TABEL TES_JML_TABLE := TES_JML_TABLE();
      7      cnt NUMBER;
      8    BEGIN
      9      EXECUTE IMMEDIATE 'select count(*) as jumlah from ' || NAMATABEL INTO CNT;
     10      FOR R IN 1..CNT
     11      LOOP
     12        TABEL.EXTEND;
     13        TABEL(R) := TES_JML_OBJ(R);
     14        dbms_output.put_line(TES_JML_OBJ(R).jumlah);
     15      END LOOP;
     16      RETURN tabel;
     17    END;
     18    /
    
    Function created.
    
    SQL> SHO ERR
    No errors.
    

    したがって、エラーなしでコンパイルされた関数実行しましょう それを見て、出力を確認してください :

    SQL> SET SERVEROUTPUT ON
    SQL> SELECT JUMLAHBARIS('EMP') FROM DUAL;
    
    JUMLAHBARIS('EMP')(JUMLAH)
    --------------------------------------------------------------------------------
    TES_JML_TABLE(TES_JML_OBJ(1), TES_JML_OBJ(2), TES_JML_OBJ(3), TES_JML_OBJ(4), TE
    S_JML_OBJ(5), TES_JML_OBJ(6), TES_JML_OBJ(7), TES_JML_OBJ(8), TES_JML_OBJ(9), TE
    S_JML_OBJ(10), TES_JML_OBJ(11), TES_JML_OBJ(12), TES_JML_OBJ(13), TES_JML_OBJ(14
    ))
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL>
    


    1. 英語とスペイン語にはどのMySQL照合/文字セットを使用する必要がありますか?

    2. テーブルの列名をどのように返しますか?

    3. SQLステートメントでの動的テーブル名

    4. PerconaXtraDBクラスターを8.0にアップグレードするためのヒント