zoukankan      html  css  js  c++  java
  • firedac调用ORACLE的存储过程

    firedac调用ORACLE的存储过程

    EMB官方原文地址:http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_Oracle_with_FireDAC

    笔者下面做的是中文翻译:

    ORALCE的存储过程,相比MSSQL,多了一个PACKAGE(包)。

    因此FIREDAC调用也稍有点不同。

    ORACLE创建存储过程的样例脚本如下:

    CREATE OR REPLACE PACKAGE FDQA_TestPack AS
      TYPE TVC2Tbl IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
      PROCEDURE TestPLSQLArray(ATable in out TVC2Tbl);
    END ADQA_testpack;
    /
    
    CREATE OR REPLACE PACKAGE BODY FDQA_TestPack AS
      PROCEDURE TestPLSQLArray(ATable IN OUT TVC2Tbl) IS
      BEGIN
        for i in ATable.First .. ATable.Last loop
          ATable(i) := '*' || ATable(i) || '*';
        end loop;
      END;
    END FDQA_testpack;
    /
    

     firedac调用ORACLE存储过程的代码如下:

    FDStoredProc1.PackageName := 'MYPACK';
    FDStoredProc1.StoredProcName := 'CLNTPROC';
    FDStoredProc1.Prepare;
    FDStoredProc1.ParamByName('AREC$CLIENT_ID').Value := 100;
    FDStoredProc1.ParamByName('AREC$NAME').Value := 'Client 1';
    FDStoredProc1.ParamByName('AREC$ACT').Value := True;
    FDStoredProc1.ExecProc;
    

      调用ORACLE高级游标返回数据集

    CREATE PROCEDURE TestRefCrs (ACrs1 IN OUT SYS_REFCURSOR, ACrs2 IN OUT SYS_REFCURSOR) AS
    BEGIN
      OPEN ACrs1 FOR SELECT * FROM "Orders";
      OPEN ACrs2 FOR SELECT * FROM "Order Details";
    END;
    

      用FDStoredProc调用:

    FDStoredProc1.FetchOptions.AutoClose := False;
    FDStoredProc1.StoredProcName := 'TESTREFCRS';
    FDStoredProc1.Open;
    // work with "Orders" table data
    FDStoredProc1.NextRecordSet;
    // work with "Order Details" table data
    FDStoredProc1.Close;
    

      用FDQuery调用:

    FDQuery1.FetchOptions.AutoClose := False;
    FDQuery1.Open('BEGIN TestRefCrs(:p1, :p2); END;');
    // work with "Orders" table data
    FDQuery1.NextRecordSet;
    // work with "Order Details" table data
    FDQuery1.Close;
    

      

    CREATE PROCEDURE TestDynCrs (ASQL IN VARCHAR2, ACrs OUT SYS_REFCURSOR) AS
    BEGIN
      OPEN ACrs FOR ASQL;
    END;
    

      调用:

    FDQuery1.FetchOptions.AutoClose := False;
    FDQuery1.SQL.Text := 'BEGIN TestDynCrs(:p1, :p2); END;';
    
    FDQuery1.Params[0].AsString := 'SELECT * FROM "Orders"';
    FDQuery1.Open;
    // work with "Orders" table data
    FDQuery1.Close;
    
    FDQuery1.Params[0].AsString := 'SELECT * FROM "Order Details"';
    FDQuery1.Disconnect;
    FDQuery1.Open;
    // work with "Order Details" table data
    FDQuery1.Close;
    

      

    Working with Oracle Nested Cursors

    FireDAC supports CURSOR type columns in SELECT lists. There may be multiple CURSORs in the list. But a CURSOR nested into a CURSOR is not supported. FireDAC sets such columns to dtRowSetRef and creates a TDataSetField for them. To process their row sets, the application should use the TFDMemTable, and set its DataSetField property to a TDataSetField reference.

    While the application navigates through the main dataset, the nested datasets will be automatically open and refreshed to provide the nested cursor records for a current record of the main dataset.

    For examples, see the FireDACSamplesDBMS SpecificOracleNestedCursors demo.

  • 相关阅读:
    【EntityFramework系列教程十,翻译】ASP.NET MVC程序中的一些高级应用
    对不含数据源的DataGridView实现自定义排序
    poj 1584 A Round Peg in a Ground Hole(叉积判断凸多边形)
    大整数运算
    poj 1408 Fishnet(计算几何)
    poj 1201 Intervals(第一道差分约束题)
    poj 2983 Is the Information Reliable?(差分约束)
    poj 2187 Beauty Contest(凸包+旋转卡壳)
    poj 2031 Building a Space Station(prim)
    poj 3007 Organize Your Train part II
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/9968701.html
Copyright © 2011-2022 走看看