如何通过传递手动参数值使用 Toad 查看 ORACLE 中 SQL 函数的输出
How to see the output of the SQL function in ORACLE using Toad by passing manual parameter values
我是 Oracle 数据库和 TOAD 的新手。我需要在 TOAD 中 运行 这个函数 GET_WRKFLW_LICENSE_LIMIT
并查看它的输出。
参数值为:
GET_WRKFLW_LICENSE_LIMIT('MSG_FORMAT', 1, NULL, NULL)
在下面附上我的代码。
CREATE OR REPLACE FUNCTION MYSCHEMA.GET_WRKFLW_LICENSE_LIMIT (
WRK_TYPE IN VARCHAR2, VCLIENT_ID IN NUMBER, VCP_ID IN NUMBER, VREQ_TYPE IN VARCHAR2)
RETURN BOOLEAN
IS
RESULT BOOLEAN;
vWRK_FLW_LIST_COUNT NUMBER (5);
vWRK_FLW_LICENCE_LIMIT NUMBER (5);
BEGIN
IF (WRK_TYPE = 'MSG_FORMAT') THEN
SELECT COUNT (*)
INTO vWRK_FLW_LIST_COUNT
FROM (SELECT MSG_TMPL_ID
FROM MYSCHEMA.VW_MSG_TMPL_FORMAT
WHERE NVL (CLIENT_ID, 1) = NVL (VCLIENT_ID, 1)
AND NVL (CP_ID, 1) = NVL (VCP_ID, 1));
BEGIN
SELECT TO_NUMBER (PARAM_VALUE)
INTO vWRK_FLW_LICENCE_LIMIT
FROM CONFIG.ENV_PARAMS
WHERE PARAM_NAME = 'TT_MSG_TMPL_THRESHOLD';
IF vWRK_FLW_LICENCE_LIMIT IS NOT NULL
AND (vWRK_FLW_LIST_COUNT <= vWRK_FLW_LICENCE_LIMIT) THEN
RESULT := TRUE;
ELSIF vWRK_FLW_LICENCE_LIMIT IS NULL THEN
RESULT := TRUE;
ELSE
RESULT := FALSE;
END IF;
EXCEPTION
WHEN OTHERS THEN
RESULT := FALSE;
RETURN RESULT;
END;
EXCEPTION
WHEN OTHERS THEN
RESULT := FALSE;
RETURN RESULT;
END;
/
你的函数有两个主要问题。
首先是它只在异常块中执行RETURN RESULT。因此,尽管它可以编译,但它会在 运行 时间与 PLS-06503: Function returned without value
一起抛出。所以你需要在最后一个异常块之前添加一个RETURN RESULT:
....
END;
RETURN RESULT;
EXCEPTION
WHEN OTHERS ....
另一个问题是它 returns 一个布尔值。这意味着你不能 运行 它在 SQL 中:它会抛出 ORA-00902: Invalid datatype
.
因此您可以在 TOAD 中使用匿名 PL/SQL 块对此进行测试:
begin
if GET_WRKFLW_LICENSE_LIMIT (
WRK_TYPE => 'MSG_FORMAT',
VCLIENT_ID => 1,
VCP_ID => null,
VREQ_TYPE => null)
then
dbms_output.put_line('True!');
else
dbms_output.put_line('False!');
end if;
end;
如果您的首选项中没有设置,请记住在 TOAD 中启用 DBMS_OUTPUT。
或者,您可能决定重写查询,使其使用 SQL 支持的数据类型,例如变种字符2。
我是 Oracle 数据库和 TOAD 的新手。我需要在 TOAD 中 运行 这个函数 GET_WRKFLW_LICENSE_LIMIT
并查看它的输出。
参数值为:
GET_WRKFLW_LICENSE_LIMIT('MSG_FORMAT', 1, NULL, NULL)
在下面附上我的代码。
CREATE OR REPLACE FUNCTION MYSCHEMA.GET_WRKFLW_LICENSE_LIMIT (
WRK_TYPE IN VARCHAR2, VCLIENT_ID IN NUMBER, VCP_ID IN NUMBER, VREQ_TYPE IN VARCHAR2)
RETURN BOOLEAN
IS
RESULT BOOLEAN;
vWRK_FLW_LIST_COUNT NUMBER (5);
vWRK_FLW_LICENCE_LIMIT NUMBER (5);
BEGIN
IF (WRK_TYPE = 'MSG_FORMAT') THEN
SELECT COUNT (*)
INTO vWRK_FLW_LIST_COUNT
FROM (SELECT MSG_TMPL_ID
FROM MYSCHEMA.VW_MSG_TMPL_FORMAT
WHERE NVL (CLIENT_ID, 1) = NVL (VCLIENT_ID, 1)
AND NVL (CP_ID, 1) = NVL (VCP_ID, 1));
BEGIN
SELECT TO_NUMBER (PARAM_VALUE)
INTO vWRK_FLW_LICENCE_LIMIT
FROM CONFIG.ENV_PARAMS
WHERE PARAM_NAME = 'TT_MSG_TMPL_THRESHOLD';
IF vWRK_FLW_LICENCE_LIMIT IS NOT NULL
AND (vWRK_FLW_LIST_COUNT <= vWRK_FLW_LICENCE_LIMIT) THEN
RESULT := TRUE;
ELSIF vWRK_FLW_LICENCE_LIMIT IS NULL THEN
RESULT := TRUE;
ELSE
RESULT := FALSE;
END IF;
EXCEPTION
WHEN OTHERS THEN
RESULT := FALSE;
RETURN RESULT;
END;
EXCEPTION
WHEN OTHERS THEN
RESULT := FALSE;
RETURN RESULT;
END;
/
你的函数有两个主要问题。
首先是它只在异常块中执行RETURN RESULT。因此,尽管它可以编译,但它会在 运行 时间与 PLS-06503: Function returned without value
一起抛出。所以你需要在最后一个异常块之前添加一个RETURN RESULT:
....
END;
RETURN RESULT;
EXCEPTION
WHEN OTHERS ....
另一个问题是它 returns 一个布尔值。这意味着你不能 运行 它在 SQL 中:它会抛出 ORA-00902: Invalid datatype
.
因此您可以在 TOAD 中使用匿名 PL/SQL 块对此进行测试:
begin
if GET_WRKFLW_LICENSE_LIMIT (
WRK_TYPE => 'MSG_FORMAT',
VCLIENT_ID => 1,
VCP_ID => null,
VREQ_TYPE => null)
then
dbms_output.put_line('True!');
else
dbms_output.put_line('False!');
end if;
end;
如果您的首选项中没有设置,请记住在 TOAD 中启用 DBMS_OUTPUT。
或者,您可能决定重写查询,使其使用 SQL 支持的数据类型,例如变种字符2。