从 PL/SQL 在 VBScript 中执行的命令获取值

Getting values from PL/SQL executed command in VBScript

我目前正在尝试从 VBScript 调用 oracle 数据库函数中的函数。我想获取在 VBScript 中执行的 pl/sql 函数的值,但我不知道该怎么做。

假设我的 pl/sql 函数:

p_result := x_found_in_y(x, y) 

(x, y 是 VARCHAR2 returns p_result BOOLEAN)

下面是我的脚本片段:

'Open connection
ConnectionString = "DSN=" & strDSN &";Uid=" & strUID & ";Pwd=" & strPWD & ";"
objConnection.Open(ConnectionString) 

'--- assuming all the variables are initialized

strQuery = 
"DECLARE p_bool BOOLEAN; BEGIN p_bool:= x_found_in_y('employee', 'employee_table'); END;"

Set objResults = objConnection.Execute strQuery

但是我不知道如何获取 p_bool(其中 returns 布尔值)并将其传递给 VBScript 中的变量。我猜这是一项简单的任务,但我对 VBScript 还很陌生。

我试图从 Whosebug 解决的问题中搜索,但似乎没有找到以前的类似案例。

我觉得应该是这样的:

Const adBoolean = 11
Const adVarChar = 200 
Const adNumeric = 131 
Const adChar = 129
Const adBigInt = 20 
Const adInteger = 3

Const adParamInput = 1
Const adParamOutput = 2
Const adParamInputOutput = 3
Const adParamReturnValue = 4

Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = objConnection

cmd.CommandText = "BEGIN ? := x_found_in_y_NUM(?, ?); END;"
cmd.Parameters.Append cmd.CreateParameter("p_bool", adInteger, adParamReturnValue)
cmd.Parameters.Append cmd.CreateParameter("x", adVarChar, adParamInput, 100, "employee")
cmd.Parameters.Append cmd.CreateParameter("y", adVarChar, adParamInput, 100, "employee_table")
cmd.Execute

Wscript.Echo cmd.Parameters("p_bool").Value

正如我在评论中所写,您不能使用 BOOLEAN 数据类型(至少不能用于 return 值)。像这样写另一个 PL/SQL 函数:

CREATE OR REPLACE FUNCTION x_found_in_y_NUM(x IN VARCHAR2, y IN VARCHAR2) RETURN INTEGER AS
BEGIN
    IF x_found_in_y(x, y) then 
        return 1;
    else
        return 0;
    end if;
END;

或者如果可能直接修改你的函数。

问号?是参数的占位符。这是使用所谓的带有绑定参数的准备好的语句的首选方式。每个 ? 映射到一个 Parameter。它减少了引用、格式问题(例如 DATE)、更好的性能和更高的安全性(google for SQL-Injection)

可以写

cmd.CommandText = "BEGIN ? := x_found_in_y_NUM('employee', 'employee_table'); END;"
cmd.Parameters.Append cmd.CreateParameter("p_bool", adInteger, adParamReturnValue)
cmd.Execute

用于 IN 参数,但这不是推荐的方法。我不认为可以在没有绑定参数的情况下使用 return(或 OUT)值。