簡體   English   中英

oracle 測試 function 包含 cursor 與 ZAC5C74B64B4B8352EF2F181AFFB5AC

[英]oracle testing function that contains cursor with sql developer

我在 oracle 中寫了一個 function 但我無法測試它。 它給出了類型錯誤,但我可以從 java 調用它。 我想在 sql 開發工具中測試它。我檢查了所有參數類型,但它們是正確的。

我的 function 是這樣的:

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

我想測試我的 function。我寫了一些這樣的代碼

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 開發人員上運行上述查詢時,它會給出這樣的錯誤(點擊:運行)

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

您可以使用variable從 SQL 工作表中對其進行測試並print

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;

注意varprint命令沒有冒號。 但在 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM