oracle测试函数,包含带有sql developer的游标
Posted
技术标签:
【中文标题】oracle测试函数,包含带有sql developer的游标【英文标题】:oracle testing function that contains cursor with sql developer 【发布时间】:2021-03-01 15:31:45 【问题描述】:我在 oracle 中编写了一个函数,但我无法测试它。它给出了类型错误,但我可以从 java 调用它。我想在sql developer tool中测试。我检查了所有的参数类型,但它们都是正确的。
我的功能是这样的:
create or replace
FUNCTION GET_STUDENT_SCORE_FN(
p_no IN VARCHAR2,
p_date IN DATE,
p_periods IN NUMBER,
p_cycle OUT VARCHAR2,
p_return_code OUT INTEGER,
p_return_desc OUT VARCHAR2)
RETURN SYS_REFCURSOR
AS
cursor_response_score SYS_REFCURSOR;
def_refcur SYS_REFCURSOR;
BEGIN
IF p_no IS NULL
THEN
p_cycle := NULL;
p_return_code := -1;
p_return_desc := ' no can not be null!';
RETURN def_refcur;
END IF;
OPEN cursor_response_score FOR
SELECT * from students;
return cursor_response_score;
END
我想测试我的功能。我写了一些这样的代码
DECLARE
P_NO VARCHAR2(200);
P_DATE DATE;
P_PERIODS NUMBER;
P_CYCLE VARCHAR2(200);
P_RETURN_CODE NUMBER;
P_RETURN_DESC VARCHAR2(200);
v_Return SYS_REFCURSOR;
BEGIN
P_NO := '5325551374';
P_DATE := to_date('1002019','ddmmyyyy');
P_PERIODS := null;
v_Return := GET_STUDENT_SCORE_FN(
P_NO => P_NO,
P_DATE => P_DATE,
P_PERIODS => P_PERIODS,
P_CYCLE => P_CYCLE,
P_RETURN_CODE => P_RETURN_CODE,
P_RETURN_DESC => P_RETURN_DESC
);
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('P_CYCLE = ' || P_CYCLE);
*/
:P_CYCLE := P_CYCLE;
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('P_RETURN_CODE = ' || P_RETURN_CODE);
*/
:P_RETURN_CODE := P_RETURN_CODE;
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('P_RETURN_DESC = ' || P_RETURN_DESC);
*/
:P_RETURN_DESC := P_RETURN_DESC;
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
*/
:v_Return := v_Return; --<-- Cursor
END;
但是当我在sql developer上运行上面的查询时会出现这样的错误(点击:运行)
ORA-06550: line 25, column 20:
PLS-00382: expression is of wrong type
ORA-06550: line 25, column 4:
PL/SQL: Statement ignored
ORA-06550: line 37, column 16:
PLS-00382: expression is of wrong type
ORA-06550: line 37, column 3:
PL/SQL: Statement ignored
我在它给出的 sql 页面上运行上面的查询
Bind Variable "P_CYCLE" is NOT DECLARED
anonymous block completed
【问题讨论】:
【参考方案1】:您可以使用 variable
和 print
从 SQL 工作表中对其进行测试:
var P_NO VARCHAR2(200);
-- has to be a string, unfortunately; var doesn't support dates directly
var P_DATE VARCHAR2(10);
var P_PERIODS NUMBER;
var P_CYCLE VARCHAR2(200);
var P_RETURN_CODE NUMBER;
var P_RETURN_DESC VARCHAR2(200);
var V_RETURN REFCURSOR;
BEGIN
:P_NO := '5325551374';
:P_DATE := '2019-02-10';
:P_PERIODS := null;
:V_RETURN := GET_STUDENT_SCORE_FN(
P_NO => :P_NO,
P_DATE => to_date(:P_DATE, 'YYYY-MM-DD'),
P_PERIODS => :P_PERIODS,
P_CYCLE => :P_CYCLE,
P_RETURN_CODE => :P_RETURN_CODE,
P_RETURN_DESC => :P_RETURN_DESC
);
END;
/
print P_CYCLE;
print P_RETURN_CODE;
print P_RETURN_DESC;
print V_RETURN;
注意var
和print
命令没有冒号;但在 PL/SQL 块中(或仅在 SQL 中)它们被视为绑定变量,因此它们确实存在。
IN 参数不一定必须绑定,因此您可以稍微简化为:
var P_CYCLE VARCHAR2(200);
var P_RETURN_CODE NUMBER;
var P_RETURN_DESC VARCHAR2(200);
var V_RETURN REFCURSOR;
BEGIN
:V_RETURN := GET_STUDENT_SCORE_FN(
P_NO => '5325551374',
P_DATE => date '2019-02-10',
P_PERIODS => null,
P_CYCLE => :P_CYCLE,
P_RETURN_CODE => :P_RETURN_CODE,
P_RETURN_DESC => :P_RETURN_DESC
);
END;
/
print P_CYCLE;
print P_RETURN_CODE;
print P_RETURN_DESC;
print V_RETURN;
【讨论】:
以上是关于oracle测试函数,包含带有sql developer的游标的主要内容,如果未能解决你的问题,请参考以下文章
我们如何使用 espresso 来测试带有 PreferenceFragment 的 android 设置活动?
Oracle 减号查询。如果顶部 SQL 和底部 SQL 不包含 NULL,我如何获得带有 NULLS 的结果?