# Function
###### tags: `Oracle` `SQL`
CREATE [OR REPLACE] FUNCTION function_name
[ (parameter [,parameter]) ]
RETURN return_datatype
IS | AS
[declaration_section]
BEGIN
executable_section
[EXCEPTION
exception_section]
END [function_name];
當回傳值為單值時調用方法為 SELECT FUNCTION() FORM DUAL OR?;
為物件時 SELECT * FROM TABLE(FUNCTION());
--------IN 參數
該參數可以在function 或procedure參考使用. 但function 或procedure不能修改該參數值
--------OUT 參數
該參數無法在function 或procedure參考使用. function 或procedure可以設定該參數值
在調用時要綁定變數
CREATE OR REPLACE PROCEDURE TESTT(RET OUT VARCHAR2) AS
BEGIN
SELECT '1' INTO RET FROM DUAL;
END;
調用
VAR RET NUMBER;
EXEC TESTT(:RET);
PRINT RET;
調用2
DECLARE
RET VARCHAR(30);
BEGIN
TESTT(RET);
dbms_output.put_line(RET);
END;
CREATE OR REPLACE PROCEDURE TESTT(VV IN VARCHAR2) IS
TT VARCHAR2(10); //定義參數
BEGIN
SELECT '11231' INTO TT FROM DUAL;
DBMS_OUTPUT.put_line (TT);
DBMS_OUTPUT.put_line ('ADADASD');
DBMS_OUTPUT.put_line (VV);
END TESTT;
set serveroutput on;--> 再調用SP時若要顯示DBMS_OUTPUT.put_line 則要先設為ON
EXEC TESTT('123123');
--------IN OUT參數
該參數可以function 或procedure參考使用, 也可以設定該參數值
--------流程控制
1.IF
IF <EXPRESSION> THEN
....
ELSIF <EXPRESSION> THEN
....
ELSE
<EXPRESSION>
END IF ;
2.CASE WHEN
TYPE1:
CASE SOMETHING_COL
WHEN VALUE1 THEN ....
WHEN VALUE2 THEN ....
WHEN VALUE3 THEN ....
[ELSE ....]
END;
TYPE2:
CASE
WHEN <EXPRESSION> THEN ....
WHEN <EXPRESSION> THEN ....
WHEN <EXPRESSION> THEN ....
[ELSE ....]
END;
3.循環
1.Loop
LOOP
....
EXIT WHEN <EXPRESSION>
END LOOP;
2.WHILE
WHILE <EXPRESSION> LOOP
...
END LOOP;
3.數字循環
FOR 變數 IN [ REVERSE 上限>下限] 下限 .. 上限 LOOP
...
END LOOP [循環標籤];
4.GOTO
<<LABEL>>
規則
跳轉到非執行句前
跳轉進子塊
跳轉到循環語句內
跳轉到條件語句內
異常處理跳回執行
條件語句的一部分跳到另外一部份
範例在5.NULL
5.NULL
在PL/SQL 中NULL是一個可以執行的語句,可以用NULL語句來說明"表示不做任何事"
DECLARE
...
BEGIN
...
IF v_num IS NULL THEN
GOTO labelPrint;
END IF;
…
<<labelPrint>>
NULL; --不處理任何事情
END;