从经典ASP调用Oracle存储过程
以下是我的代码片段:从经典ASP调用Oracle存储过程,oracle,stored-procedures,asp-classic,Oracle,Stored Procedures,Asp Classic,以下是我的代码片段: Set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = objCon cmd.CommandType = 4 cmd.CommandText = "SP_USERLOGIN" response.Write(p_user_id) cmd.Parameters.Append cmd.CreateParameter ("User_locked
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = objCon
cmd.CommandType = 4
cmd.CommandText = "SP_USERLOGIN"
response.Write(p_user_id)
cmd.Parameters.Append cmd.CreateParameter ("User_locked",adVarChar, adParamInput)
cmd.parameters(0).value = p_user_id
cmd.Execute
尝试附加参数时,出现以下错误:
参数类型错误,超出可接受范围,或者
相互冲突
我的存储过程只接受1个参数:
create or replace PROCEDURE SP_USERLOGIN ( User_locked VARCHAR2 ) as
BEGIN
update tusers Set user_account_status='status' where user_id = User_locked;
commit;
END;
问题是诸如
adVarChar
等常量没有定义。未定义参数的长度可能存在第二个问题(这是第四个参数)
有一个文件名ADOVBS.INC
定义了这些,如果没有包含,则必须使用常量值
当这个问题消失的时候
cmd.Parameters.Append cmd.CreateParameter ("User_locked",adVarChar, adParamInput)
。。。更改为:
cmd.Parameters.Append cmd.CreateParameter ("User_locked",200, 1, 30)
上面的30
是varchar
的长度值,这是一个很小的(Oracle)解决方案,用于替换笨拙的cmd对象及其参数处理。
假设要执行存储过程PROC1并向其传递两个参数。创建一个名为dummy的虚拟表,其中有两个字段的类型与参数相对应。您可以插入一行,其中包含任意值。将更新前触发器设置为DUMMY。触发器必须执行与PROC1完全相同的操作,并将其参数作为“更新”记录(:new.a,:new.b)的字段读取。
在ASP中,使用“updateschema.dummy set a=…,b=…”语句,就是这样。
缺点:非正统。
优点:ASP代码更干净;易于调试。
+以同样的方式向后返回参数,读取虚拟表(顺便说一句,任何表)。只是猜测,但您可能需要在
CreateParameter
调用中指定varchar长度:。。。CreateParameter(“用户锁定”,adVarChar,adParamInput,30)
。30只是一个例子;输入您希望传递的最长字符串。我做了更改,但得到了相同的错误p\u user\u id
的值是多少?如果为空,则可能存在问题。对不起,这是我唯一能想到的。您确定像adVarChar
这样的值是否已定义?我看到您使用的是4
而不是adCmdStoredProc
adVarChar
=200
和adParamInput
=1
,所以您可以尝试cmd.Parameters.Append cmd.CreateParameter(“用户锁定”,200,1,30)
?这是个好消息!我会发帖作为答复。