我在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的权限。这只是今年没有数据= |