Получение значений из исполняемой команды PL / SQL в VBScript - PullRequest
0 голосов
/ 05 ноября 2018

В настоящее время я пытаюсь вызвать функцию из базы данных оракула из VBScript. Я хочу получить значение функции pl / sql, которую я выполнил в VBScript, но я не знаю, как это сделать.

скажем, моя функция pl / sql:

p_result := x_found_in_y(x, y) 

(x, y VARCHAR2 возвращает 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 (который возвращает логическое значение) и передать его переменной в VBScript. Я предполагаю, что это простая задача, но я ОЧЕНЬ новичок в VBScript.

Я пытался найти ответы на вопросы, решенные в stackoverflow, но, похоже, не нашел предыдущих подобных случаев.

1 Ответ

0 голосов
/ 05 ноября 2018

Я думаю, что это должно быть так:

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 (как минимум, не для возвращаемого значения). Напишите еще одну функцию 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;

Или, если возможно, измените вашу функцию напрямую.

Знаки вопроса ? являются заполнителями для параметров. Это предпочтительный способ использования так называемых подготовленных операторов с параметрами связывания. Каждый ? отображается на один Параметр . Это дает вам меньше проблем с цитированием, проблемами форматирования (например, для DATE), лучшей производительностью и большей безопасностью (Google для SQL-инъекций)

Можно написать

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

для параметров IN, но это не рекомендуемый способ сделать это. Я не думаю, что можно использовать возвращаемые (или OUT) значения без параметров привязки.

...