3

PHP プログラムから Oracle プロシージャを実行しようとしています。簡単なテスト手順を作成しました。

CREATE OR REPLACE PROCEDURE "JKJ3"."GetUserLogin"
{
    userlogin_in in varchar2,
    userid_out out numeric,
    pass_out out varchar2
}
IS 
BEGIN
    SELECT user_id, password
    INTO userid_out, pass_out
    FROM "JKJ3"."USERS"
    WHERE login = userlogin_in;
END;

Aqua Data Studio を使用して手順をテストしました。

DECLARE
    userid_out number;
    password_out number;
BEGIN
    "JKJ3"."GetUserLogin"('UserName', userid_out, password_out);
    dbms_enable(10000);
    dbms_put_line(userid_out);
    dbms_put_line(password_out);
END;

これは正常に機能し、ユーザー ID とパスワードの値を返します。ここまでは順調ですね!

PHP からプロシージャを実行しようとしましたが、命を救うためにプロシージャを動作させることができません! PHP コード:

PutEnv("ORACLE_HOME=/afs/cad/solaris/oraclient10.2");   
$this->conn=oci_connect($this->ucid, $this->dbpassword, $this->db);

// Check if connection was sucessful.
if ( !$this->conn ) {
    echo "Unable to connect: " . var_dump( OCIError() );
    die("Unable to connect: " . var_dump( OCIError() ));
}

$query = 'BEGIN "JKJ3"."GetUserLogin"(:login_in, :userid_out, :password_out); END;';

// Execute stored procedure to add new user and return the new users ID        
$command = oci_parse($this->conn, $query) or die('Cannot parse query');

$userid;
$password_out;

// bind the input variables and out put variables.
oci_bind_by_name($command, ':login_in', $login, 30) or die('cannot bind login');        
oci_bind_by_name($command, ':userid_out', $userid) or die('cannot bind userid');
oci_bind_by_name($command, ':password_out', $password_out, 300) or die('cannot bind password');              

oci_execute($command);
echo 'userid = ' . $userid . ' password = ' . $password_out;
oci_close($this->conn); 

これを実行すると、null のユーザー ID とパスワードが取得されます。

編集 他の手順でも同じ結果が得られます.静的な値を取得して戻り変数に割り当てる手順を作成することさえしましたが、何も返されません(エラーを含む)。
http://www.oracle.com/technetwork/articles/fuecks-sps-095636.html (sayHello の例)。この手順も、Aqua Data Studio からは機能しますが、PHP からは機能しません。例外はスローされず、変数は返されません。

Oracle には、Oracle に対して実行されているクエリを表示できる SQL SERVER Profiler のようなものがありますか? (ただし、サーバーの管理者権限はありません)。

ADSから動作するため、許可ベースであるとは思えません。

問題なくデータベースに対してクエリを実行できるので、接続が機能していると確信しています。

明らかな何かが欠けていますか?

4

2 に答える 2

3

私は PHP に詳しくありませんが、oci_bind_by_nameのマニュアルページによると:

PHP が戻り値を保持するのに十分なメモリを割り当てるように、OUT バインドを使用する場合は maxlength を指定する必要があります。

また、PL/SQL ブロックに少なくとも 1 つの軽微な構文エラーがあります。を参照するときは、常に二重引用符を使用する必要がありますGetUserLogin。(それがあなたの主な問題だとは思いませんが。もしそうなら、エラーメッセージが表示されるはずです。)

于 2012-07-05T05:58:33.930 に答える
1

これと戦った後、それは私の側の多くのエラーでした(常にではありませんか?):

  1. PL/SQL ブロック内のプロシージャを引用符で囲まない (および質問に対するマーク付きの回答)。

    $query = 'BEGIN "JKJ3"."GetUserLogin"(:login_in, :userid_out, :password_out); END;';

  2. エラー報告がオンになっていない (そして問題が何であるかを確認していない)。

error_reporting(E_ALL); ini_set('display_errors', true);

  1. 出力サイズがありません。

  2. ログイン変数とパスワード変数を転置したため、間違った変数を渡してしまいました (恥ずかしくて頭が下がります)。

于 2012-07-05T23:25:12.563 に答える