簡體   English   中英

使用Oracle和PHP:在SQL Developer中有效,但是PHP文件導致ORA-00900:無效的語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM