Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle过程输出参数从PHP返回-1_Php_Oracle_Stored Procedures_Oracle11g - Fatal编程技术网

Oracle过程输出参数从PHP返回-1

Oracle过程输出参数从PHP返回-1,php,oracle,stored-procedures,oracle11g,Php,Oracle,Stored Procedures,Oracle11g,我试图从我的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 F

我试图从我的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;
这可以正常工作,返回userid和密码值。到目前为止还不错

我试着从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); 
当我执行此操作时,我会得到一个userid和null密码

编辑 我对其他过程也有相同的结果,我甚至创建了一个过程,该过程接受并为返回变量分配一个静态值,但仍然没有返回任何结果(包括没有错误)。
(比如说你好)。 同样,该过程可以在Aqua Data Studio中工作,但不能在PHP中工作。没有引发异常,也没有返回变量

Oracle是否具有类似SQL SERVER Profiler的功能,允许您查看针对Oracle执行的查询?(不过我没有服务器的管理员权限)

似乎它不可能是基于许可的,因为它是通过广告工作的

我可以毫无问题地对数据库运行查询,因此我确信我的连接正在工作


我是否遗漏了一些明显的东西?

我不熟悉PHP,但根据oci\u bind\u by\u name的页面:

使用外绑定时必须指定maxlength,以便PHP 分配足够的内存来保存返回的值


此外,PL/SQL块中至少有一个小语法错误。在引用
GetUserLogin
时,需要始终使用双引号。(虽然我怀疑这是您的主要问题。如果是,您应该会收到一条错误消息。)

与此抗争之后,我犯了很多错误(不是一直都是这样吗?)

  • 在PL/SQL块中的过程周围没有引号(并标记问题的答案)

    $query='开始“JKJ3”。“GetUserLogin”(:login\u in,:userid\u out,:password\u out);"完";

  • 没有打开错误报告(并查看问题所在)

  • 
    错误报告(E_全部);
    ini设置(“显示错误”,真);
    

  • 没有输出大小

  • 传入错误的变量,因为我转换了登录和密码变量(羞愧地垂下头)


  • 谢谢,我错过了,但是,我添加了输出长度,它仍然不起作用。我尝试了PL/SQL块,包括引号、大写字母和驼峰字母。我还发现ocibindbyname(以及OCICExecute…等)在PHP5.4.0中已经贬值。有利于oci\u按名称别名绑定。除非PHP或OCI做了一些奇怪的事情,否则引号应该很重要。您是否有多个版本的该过程,一个是用引号定义的,另一个是不带引号的?我检查了,每个过程只有一个版本。我还发现奇怪的是,我从未收到错误消息,甚至更改为不存在的存储过程。