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

パラメータをOracleDynamicSQLにバインドする

    DBMS_SQLパッケージを使用できます。これは、動的SQLを実行するための代替方法を提供します。使用するのはおそらく少し面倒ですが、特にバインドパラメータの数を変えると、より柔軟になります。

    使用方法は次のとおりです(警告:これはテストしていません):

    FUNCTION player_search (
       pName        IN VARCHAR2,
       pHeight      IN NUMBER,
       pTeam        IN VARCHAR2
    ) RETURN SYS_REFCURSOR
    IS 
      cursor_name   INTEGER;
      ignore        INTEGER;
      id_var        MyTable.ID%TYPE;
      name_var      MyTable.Name%TYPE;
      height_var    MyTable.Height%TYPE;
      team_var      MyTable.Team%TYPE;
    BEGIN
      -- Put together SQLQuery here...
    
      -- Open the cursor and parse the query         
      cursor_name := DBMS_SQL.OPEN_CURSOR; 
      DBMS_SQL.PARSE(cursor_name, SQLQuery, DBMS_SQL.NATIVE); 
    
      -- Define the columns that the query returns.
      -- (The last number for columns 2 and 4 is the size of the
      -- VARCHAR2 columns.  Feel free to change them.)
      DBMS_SQL.DEFINE_COLUMN(cursor_name, 1, id_var); 
      DBMS_SQL.DEFINE_COLUMN(cursor_name, 2, name_var, 30); 
      DBMS_SQL.DEFINE_COLUMN(cursor_name, 3, height_var); 
      DBMS_SQL.DEFINE_COLUMN(cursor_name, 4, team_var, 30); 
    
      -- Add bind variables depending on whether they were added to
      -- the query.
      IF pName IS NOT NULL THEN
        DBMS_SQL.BIND_VARIABLE(cursor_name, ':pName', pName);
      END IF;
    
      IF pHeight > 0 THEN
        DBMS_SQL.BIND_VARIABLE(cursor_name, ':pHeight', pHeight);
      END IF;
    
      IF pTeam IS NOT NULL THEN
        DBMS_SQL.BIND_VARIABLE(cursor_name, ':pTeam', pTeam);
      END IF;
    
      -- Run the query.
      -- (The return value of DBMS_SQL.EXECUTE for SELECT queries is undefined,
      -- so we must ignore it.)
      ignore := DBMS_SQL.EXECUTE(cursor_name); 
    
      -- Convert the DBMS_SQL cursor into a PL/SQL REF CURSOR.
      RETURN DBMS_SQL.TO_REFCURSOR(cursor_name);
    
    EXCEPTION 
      WHEN OTHERS THEN 
        -- Ensure that the cursor is closed.
        IF DBMS_SQL.IS_OPEN(cursor_name) THEN 
          DBMS_SQL.CLOSE_CURSOR(cursor_name); 
        END IF; 
        RAISE; 
    END; 
    

    (注:DBMS_SQL.TO_REFCURSOR Oracle 11gの新機能です。)



    1. to_charによるフォーマット間隔

    2. Postgresqlスキーマパスを永続的に設定する

    3. MariaDB 10.0/10.1でのInnoDBパーティションのインポート

    4. MySQLデータベースのパフォーマンスを提供するためのヒント-パート1-