sql >> データベース >  >> RDS >> Oracle

OracleとPHPの使用:SQL Developerで動作しますが、PHPファイルの結果ORA-00900:無効なステートメント

    私はそれを理解したと思います。その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;
        }
    }
    



    1. ストアドプロシージャでmysql_affected_rows()を使用する方法

    2. ベストプラクティス:バナーインプレッションの追跡

    3. 15パズルのパターンデータベース(5-5-5)を作成するための実用的なソリューションが必要

    4. MySQLでは、FKでCONSTRAINTは何をしますか?