我正在尝试让 Oracle 过程从我的 PHP 程序中执行。我创建了一个简单的测试程序:
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 是否有类似于 SQL SERVER Profiler 的东西,可以让您查看针对 Oracle 执行的查询? (虽然我没有服务器的管理员权限)。
它似乎不是基于许可的,因为它是从 ADS 运行的。
我可以毫无问题地对数据库运行查询,因此我确信我的连接正常工作。
我是否漏掉了一些明显的东西?
最佳答案
我不熟悉PHP,但是根据manual oci_bind_by_name 页面:
You must specify maxlength when using an OUT bind so that PHP allocates enough memory to hold the returned value.
此外,您的 PL/SQL block 中至少存在一个小语法错误。引用 GetUserLogin 时,您需要始终使用双引号。 (尽管我怀疑这是您的主要问题。如果是,您应该会收到一条错误消息。)
关于php - Oracle 过程输出参数从 PHP 返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11336623/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案