DOBON.NETプログラミング道掲示板

No34045 の記事


■34045 / )  Re[2]: oo4oのAddTableをADOに移行したい
□投稿者/ 魔界の仮面弁士 大御所(1172回)-(2018/11/27(Tue) 11:19:43)
  • アイコン
    No34043に追記(魔界の仮面弁士の記事)
    > 実験してみました。 
    
    参考までに、当方が実験で用いたパッケージを示しておきます。
    
    --CREATE TABLE TEST_TABLE (COL1 VARCHAR2(2000), COL2 NUMBER );
    --/
    CREATE OR REPLACE PACKAGE PKG_SAMPLE
    AS
        TYPE TestArray IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
        PROCEDURE EXAMPLE(inAnimal IN TestArray);
    END PKG_SAMPLE;
    /
    CREATE OR REPLACE PACKAGE BODY PKG_SAMPLE AS
        PROCEDURE EXAMPLE(inAnimal IN TestArray) IS
           IDX BINARY_INTEGER;
           VAL VARCHAR2(2000);
        BEGIN
           IDX := inAnimal.FIRST;
           FOR N IN 1..inAnimal.COUNT LOOP
              VAL := inAnimal(IDX);
              INSERT INTO TEST_TABLE (COL1, COL2) VALUES ( VAL, IDX );
              IDX := inAnimal.NEXT(IDX);
           END LOOP;
        END EXAMPLE;
    END PKG_SAMPLE;
    /
    /* ADO 側
      Dim cmd As ADODB.Command
      Set cmd = New ADODB.Command
      Set cmd.ActiveConnection = cn
      cmd.CommandText = "PKG_SAMPLE.EXAMPLE"
      cmd.CommandType = adCmdStoredProc
    */
    
    
    > Set p = cmd.CreateParameter("inAnimal", 型, adParamInput)
    
    ここの『型』を調べるために、OLE DB でスキーマを取得してみました。
    
    'https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms713623(v%3dvs.85)
    Dim rs1 As ADODB.Recordset
    // 下記は "SELECT * FROM USER_ARGUMENTS" に相当
    Set rs1 = cn.OpenSchema(adSchemaProcedureParameters)
    
    
    OraOLEDB.Oracle の場合は 1 件のみ返却され、
    MSDAORA で取得した場合は 2 件となっていましたが、
    いずれも、、パラメータの型として adIUnknown が得られましたので、
    値として要求されているのは、いわゆる配列(SAFEARRAY) ではなく、
    何らかの配列オブジェクト(COM インターフェイス)が要求されるようです。
    
    以下に結果を記します。
    (Recordset の列数が多いので、行列変換して縦に並べています)
    
    ==========================================================================
    【OraOLEDB.Oracle の場合】… 1 件が該当
    (1/1) --------------------------------------------------------------------
           Procedure_Catalog: (null)
            Procedure_Schema: スキーマ名
              Procedure_Name: "PKG_SAMPLE.EXAMPLE"
              Parameter_Name: "INANIMAL"
            Ordinal_Position: 1
              Parameter_Type: 1 (adParamInput)
        Parameter_HasDefault: (null)
           Parameter_Default: (null)
                 Is_Nullable: -1 (VARIANT_TRUE)
                    DataType: 13 (adIUnknown)
    Character_Maximum_Length: (null)
      Character_Octet_Length: (null)
           Numeric_Precision: (null)
               Numeric_Scale: (null)
                 Description: (null)
                   Type_Name: "PL/SQL TABLE"
             Local_Type_Name: "PL/SQL TABLE"
                    Overload: (null)
    ==========================================================================
    【MSDAORA の場合】… 何故か 2 件が該当
    (1/2) --------------------------------------------------------------------
           Procedure_Catalog: (null)
            Procedure_Schema: スキーマ名
              Procedure_Name: "PKG_SAMPLE.EXAMPLE"
              Parameter_Name: "INANIMAL"
            Ordinal_Position: 1
              Parameter_Type: 1 (adParamInput)
        Parameter_HasDefault: 0 (VARIANT_FALSE)
           Parameter_Default: (null)
                 Is_Nullable: -1 (VARIANT_TRUE)
                    DataType: 13 (adIUnknown)
    Character_Maximum_Length: (null)
      Character_Octet_Length: (null)
           Numeric_Precision: (null)
               Numeric_Scale: (null)
                 Description: (null)
                   Type_Name: "PL/SQL TABLE"
             Local_Type_Name: (null)
                    Overload: (null)
    (2/2) --------------------------------------------------------------------
           Procedure_Catalog: (null)
            Procedure_Schema: スキーマ名
              Procedure_Name: "PKG_SAMPLE.EXAMPLE"
              Parameter_Name: (null)
            Ordinal_Position: 1
              Parameter_Type: 1 (adParamInput)
        Parameter_HasDefault: 0 (VARIANT_FALSE)
           Parameter_Default: (null)
                 Is_Nullable: -1 (VARIANT_TRUE)
                    DataType: 129 (adChar)
    Character_Maximum_Length: 2000
      Character_Octet_Length: 2000
           Numeric_Precision: (null)
               Numeric_Scale: (null)
                 Description: (null)
                   Type_Name: "VARCHAR2"
             Local_Type_Name: (null)
                    Overload: (null)
    ==========================================================================

違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -