![](/img/trans.png)
[英]ORACLE Stored procedure works on sql developer but not in php
[英]Using Oracle and PHP: Works in SQL Developer but PHP file results ORA-00900: Invalid Statement
當我從先前的文章“ 使用Oracle將三個表與PIVOT合並到一個表 ”中的代碼並在SQL Developer中單擊“運行腳本”時,一切工作都很好,但是當我嘗試從PHP文件執行相同的腳本時,出現“ ORA-00900 SQL語句無效”-錯誤。 SQL開發人員的“運行語句”也無法執行代碼。 看來我的代碼不是“ SQL語句”語法?
我的用於將sql腳本放入變量的PHP代碼:
$sql = "variable x REFCURSOR
DECLARE
exam_ids VARCHAR2(255);
BEGIN
SELECT
LISTAGG(''''
|| exam_id
|| ''' AS \"'
|| exam_name
|| '\"',',') WITHIN GROUP(
ORDER BY
exam_id ASC
)
INTO exam_ids
FROM
exam;
OPEN :x FOR 'SELECT
*
FROM
(
SELECT
u.user_id,
u.user_name,
e.exam_id,
eu.exam_date
FROM
users u
LEFT JOIN exam_user eu ON u.user_id = eu.user_id
LEFT JOIN exam e ON e.exam_id = eu.exam_id
ORDER BY
u.user_id
)
PIVOT ( MAX ( exam_date )
FOR exam_id
IN ( ' || EXAM_IDS || ' )
)
ORDER BY
1';
END;
/
print x";
然后,我將$ sql變量傳遞給結果函數:
function getSQLResult($sql, $conn) {
$stmt = OCIParse($conn, $sql);
if( $stmt === false ) {
errorShutdown(__('...'), __('...'));
die();
} else {
//Executes a statement
if (OCIExecute($stmt)) {
return $stmt;
}
else {
$err = oci_error($stmt);
echo '<pre>';
print_r($err);
echo '</pre>';
return false;
}
}
}
那么誰能告訴我如何重構代碼?
謝謝你的幫助!
我想我知道了。 似乎需要從該PL / SQL腳本制作一個過程:
CREATE OR REPLACE PROCEDURE getExamStatus(RC OUT SYS_REFCURSOR) AS
exam_ids VARCHAR2(255);
BEGIN
SELECT
LISTAGG(''''
|| exam_id
|| ''' AS \"'
|| exam_name
|| '\"',',') WITHIN GROUP(
ORDER BY
exam_id ASC
)
INTO exam_ids
FROM
exam;
OPEN rc FOR 'SELECT
*
FROM
(
SELECT
u.user_id,
u.user_name,
e.exam_id,
eu.exam_date
FROM
users u
LEFT JOIN exam_user eu ON u.user_id = eu.user_id
LEFT JOIN exam e ON e.exam_id = eu.exam_id
ORDER BY
u.user_id
)
PIVOT ( MAX ( exam_date )
FOR exam_id
IN ( ' || EXAM_IDS || ' )
)
ORDER BY
1';
END;
/
然后在數據庫中運行該過程。 之后,在PHP文件中,我不得不重構sql語句:
$sql = "BEGIN getExamStatus(:rc); END;";
和功能:
function getSQLResult($sql, $conn) {
$stmt = oci_parse($conn, $sql);
if( $stmt === false ) {
errorShutdown(__('...'), __('...'));
die();
} else {
$rc = oci_new_cursor($conn);
oci_bind_by_name($stmt, ':rc', $rc, -1, OCI_B_CURSOR);
if(!oci_execute($stmt)) {
return false;
//return oci_error($stmt);
}
if(!oci_execute($rc)) {
return false;
//return oci_error($stmt);
}
$results = array();
while (($row = oci_fetch_array($rc, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
$results[] = $row;
}
oci_free_statement($stmt);
oci_free_statement($rc);
return $results;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.