无法从一个事务中由存储过程创建的db2创建的全局时态表中使用php获取数据

时间:2017-10-31 13:14:09

标签: php stored-procedures pdo transactions db2

我在z / OS上获得了远程DB2,并且仅对存储过程拥有权限(以及创建由它们创建的全局临时表,如果 SELECT 来自其他表 - 获得权限错误)。

DB2管理员说我没有数据输出,因为我在调用存储过程之后提交事务并且创建全局时态表后立即清除。但是在代码中,我只有在从创建的全局时态表中进行选择后才能获得 beginTransaction commit 。尝试使用此代码获取数据:

try {
    $conPDO = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=DB;HOSTNAME=192.168.10.10;PORT=446;PROTOCOL=TCPIP;", "log", "pass"
        , [
            PDO::ATTR_PERSISTENT => TRUE,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
            PDO::ATTR_AUTOCOMMIT => FALSE,
        ]
    );
    $conPDO->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);

    $transactionOn = $conPDO->beginTransaction();
    echo "<pre>";
    echo("Begin of Transaction: ");
    var_dump($transactionOn);
    echo "</pre>";

    echo "<pre>";
    echo("PDO::inTransaction: ");
    var_dump($conPDO->inTransaction());
    echo "</pre>";

    echo "<pre>";
    var_dump($conPDO);
    echo "</pre>";
    $sql = "CALL SOME.PROCEDURE (3,'2017-05-01',0,0,0,?,?,?);";
    $stmt = $conPDO->prepare($sql);
    $stmt->bindParam(1, $errorNumber, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT);
    $stmt->bindParam(2, $errorCode, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT);
    $stmt->bindParam(3, $errorMC, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT);
    $exec = $stmt->execute();
    echo "<pre>";
    echo("SQL: ");
    var_dump($sql);
    echo("Result of CALL execution: ");
    var_dump($exec);
    echo "</pre>";

    $sqlSelect = "SELECT * FROM SOME.TMP_TABLE;";
    $stmt = $conPDO->prepare($sqlSelect);
    $exec = $stmt->execute();
    echo "<pre>";
    echo("SQL: ");
    var_dump($sqlSelect);
    echo("Result of SELECT execution: ");
    var_dump($exec);
    echo "</pre>";

    echo "<pre>";
    echo("Result of fetchAll from SELECT: ");
    var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
    echo "</pre>";

    $stmt->closeCursor();
    $stmt = null;
    $commit = $conPDO->commit();

    echo "<pre>";
    echo("Result of Commit: ");
    var_dump($commit);
    echo "</pre>";
    echo "<pre>";
    echo("PDO::inTransaction: ");
    var_dump($conPDO->inTransaction());
    echo "</pre>";
} catch (Exception $e) {
    echo($e->getMessage());
}

在输出中我得到了:

  

交易开始:bool(true)

     

PDO :: inTransaction:bool(true)

     

对象(PDO)#1(0){}

     

SQL:&#34; ...&#34;

     

CALL execurion的结果:bool(true)

     

SQL:&#34; ...&#34;

     

SELECT执行结果:bool(true)

     

来自SELECT的fetchAll的结果:array(0){}

     

提交结果:bool(true)

     

PDO :: inTransaction:bool(false)

就像从输出看起来一样 - 一切正常,并且从创建的全局temporarl表中 SELECT 只返回no data = array(0)。就像从存储过程中没有收集数据一样。

这里有什么不妥?

__ UPD:

存储过程DDL(我真的不太了解DB2过程):

 SET CURRENT SQLID='D90'`                                           

  CREATE PROCEDURE SOME.PROCEDURE

     (IN P0 SMALLINT ,                                               

      IN P1 DATE ,                                                   

      IN P2 INTEGER ,                                                 

      IN P3 INTEGER ,                                                

      IN P4 INTEGER ,                                                

      OUT P5 INTEGER ,                                               

      OUT P6 INTEGER ,                                               

      OUT P7 VARCHAR(800) FOR SBCS DATA CCSID EBCDIC )               

    EXTERNAL NAME 'PROCEDURE'                                         

    LANGUAGE C  PARAMETER STYLE DB2SQL  NOT DETERMINISTIC  FENCED    

    CALLED ON NULL INPUT  MODIFIES SQL DATA  NO PACKAGE PATH         

    NO DBINFO  COLLID LGDP13  WLM ENVIRONMENT DB2DAPP1               

    ASUTIME NO LIMIT  STAY RESIDENT NO  PROGRAM TYPE MAIN            

    SECURITY DEFINER  INHERIT SPECIAL REGISTERS                      

    STOP AFTER SYSTEM DEFAULT FAILURES  COMMIT ON RETURN NO `  

__ UPDATED_PROBLEM已解决

dbAdministrator获得对所有表完全访问此db2的权限。这只是今年没有数据= |

0 个答案:

没有答案