---
# System prepended metadata

title: Function
tags: [SQL, Oracle]

---

# 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;
 