从经典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)
?这是个好消息!我会发帖作为答复。