您好,登錄后才能下訂單哦!
- 不同數據庫對SQL語言的擴展:
注意:當使用DBMS_OUPUT包輸出信息時,需要設置SQL*Plus環境serveroutput的值為ON。(使用 /后,鍵入回車鍵執行PL/SQL程序)
SQL> begin dbms_output.put_line('hello everyone!');
end;
/
PL/SQL procedure successfully completed
SQL> set serveroutput on
SQL> begin dbms_output.put_line('hello everyone!');
end;
/
hello everyone!
PL/SQL procedure successfully completed
2、使用SQL Window窗口:在PLSQL Developer工具中,使用菜單欄中的New ->SQL Window打開命令行:
begin dbms_output.put_line('hello everyone!');
end;
標識符 | 命令規則 | 例子 |
---|---|---|
程序變量 | v_name | v_sal |
程序常量 | c_name | c_pi |
游標變量 | name_curror | emp_curror |
異常標識 | e_name | e_integrity_error |
記錄類型 | name_record | emp_record |
DECLARE
v_name VARCHAR2(10);
v_sal NUMBER(7,2);
v_hiredate DATE;
c_tax_rate CONSTANT NUMBER(3,2) := 0.02;
v_tax_sal NUMBER(7,2);
v_valid BOOLEAN DEFAULT TRUE;
BEGIN
SELECT ename, sal, hiredate INTO v_name, v_sal, v_hiredate FROM emp WHERE empno = 7369;
--計算所得稅
v_tax_sal := v_sal * c_tax_rate;
--打印輸出
DBMS_OUTPUT.put_line(v_name ||'的工資是:' || v_sal ||', 雇員日期是:' || v_hiredate || ',所得稅是:' || v_tax_sal);
F v_valid THEN
DBMS_OUTPUT.put_line('已核實');
END IF;
END;
DECLARE
v_name varchar2(10);
v_sal number(7,2);
BEGIN
SELECT ename, sal INTO v_name, v_sal FROM emp WHERE empno = 7788;
--打印姓名和薪水
DBMS_OUTPUT.PUT_LINE(v_name || '的工資是:' || v_sal);
END;
DECLARE
--定義引用型變量
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
--將7788的姓名和工資賦值給定義的引用型變量
SELECT ename, sal INTO v_name, v_sal FROM emp WHERE empno = 7788;
--打印姓名和薪水
DBMS_OUTPUT.put_line(v_name || '的工資是:' || v_sal);
END;
DECLARE
--定義記錄型變量
emp_record emp%ROWTYPE;
BEGIN
--將7788的員工信息賦值給了記錄型變量emp_record
SELECT * INTO emp_record FROM emp WHERE empno = 7788;
--打印姓名和薪水
DBMS_OUTPUT.PUT_LINE(emp_record.ename || '的工資是:' || emp_record.sal);
END;
運算符 | 意義 |
---|---|
+ | 加號 |
- | 減號 |
* | 乘號 |
/ | 除號 |
** | 乘方 |
BEGIN
dbms_output.put_line(10 + 2);
dbms_output.put_line(10 - 2);
dbms_output.put_line(10 * 2);
dbms_output.put_line(10 / 2);
dbms_output.put_line(10 ** 2);
END;
運算符 | 意義 |
---|---|
= | 等于 |
<>, !=, ~=, ^= | 等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
DECLARE
v_num1 NUMBER(2) := &n1;
v_num2 NUMBER(2) := &n2;
BEGIN
IF(v_num1 = v_num2) THEN
DBMS_OUTPUT.put_line('num1 等于 num2');
ELSIF(v_num1 < v_num2) THEN
DBMS_OUTPUT.put_line('num1 小于 num2');
ELSIF(v_num1 > v_num2) THEN
DBMS_OUTPUT.put_line('num1 大于 num2');
END IF;
IF(v_num1 <> v_num2) THEN
DBMS_OUTPUT.put_line('num1 不等于 num2');
END IF;
END;
運算符 | 意義 |
---|---|
IS NULL | 是空值 |
BETWEEN...AND | 介于兩者之間 |
IN | 等于列表中的某個值 |
示例:
DECLARE
v_num1 NUMBER(2) := &n1;
BEGIN
IF(v_num1 BETWEEN 5 AND 10) THEN
DBMS_OUTPUT.put_line('num1 介于5 到10之間');
ELSE
DBMS_OUTPUT.put_line('num1 不在5到10之間');
END IF;
IF(v_num1 IN(3, 8, 10)) THEN
DBMS_OUTPUT.put_line('num1 等于3, 8 , 10中的一個值');
ELSE
DBMS_OUTPUT.put_line('num1 不等于3, 8 , 10中的一個值');
END IF;
IF(v_num1 IS NULL) THEN
DBMS_OUTPUT.put_line('num1 為空');
ELSE
DBMS_OUTPUT.put_line('num1 不為空');
END IF;
END;
邏輯符 | 意義 |
---|---|
AND | 邏輯與 |
NOT | 邏輯或 |
OR | 取反,如IS NOT NULL, NOT IN |
示例:
DECLARE
v_b1 BOOLEAN := &n1;
v_b2 BOOLEAN := &n2;
BEGIN
IF(v_b1 AND v_b2) THEN
DBMS_OUTPUT.put_line('AND --true');
END IF;
IF(v_b1 OR v_b2) THEN
DBMS_OUTPUT.put_line('OR --true');
END IF;
IF(NOT v_b1) THEN
DBMS_OUTPUT.put_line('b_v1取反為TRUE');
END IF;
END;
- 附加說明:PL/SQL流程控制語句分類:
- CASE語句中使用單一選擇符進行等值比較的語法格式:
CASE selector
WHEN expression1 THEN sequence_of_statements1;
WHEN expression2 THEN sequence_of_statements2;
......
WHEN expressionN THEN sequence_of_statementsN;
[ELSE sequence_of_statements;]
END CASE;
DECLARE
v_grade CHAR(1) := '&n';
BEGIN
CASE v_grade
WHEN 'A' THEN
DBMS_OUTPUT.put_line('優秀');
WHEN 'B' THEN
DBMS_OUTPUT.put_line('中等');
WHEN 'C' THEN
Dbms_Output.put_line('一般');
ELSE
DBMS_OUTPUT.put_line('輸入有誤');
END CASE;
END;
- CASE語句中使用多種條件比較的語法格式:
CASE
WHEN condition1 THEN sequence_of_statements1;
WHEN condition2 THEN sequence_of_statements2;
......
WHEN conditionN THEN sequence_of_statementsN;
[ELSE sequence_of_statements;]
END CASE;
DECLARE
v_sal emp01.sal%TYPE;
v_empno emp01.empno%TYPE := &no;
BEGIN
SELECT sal INTO v_sal FROM emp01 WHERE empno = v_empno;
CASE
WHEN v_sal < 1500 THEN
UPDATE emp01 SET comm = nvl(comm, 0) + 100 where empno = v_empno;
WHEN v_sal < 2500 THEN
UPDATE emp01 SET comm = nvl(comm, 0) + 80 where empno = v_empno;
WHEN v_sal < 5000 THEN
UPDATE emp01 SET comm = nvl(comm, 0) + 50 where empno = v_empno;
COMMIT;
END CASE;
END;
DECLARE
v_cnt INT :=1;
BEGIN
LOOP
DBMS_OUTPUT.put_line(v_cnt);
EXIT WHEN v_cnt = 10;
v_cnt := v_cnt + 1;
END LOOP;
END LOOP;
DECLARE
v_cnt INT :=1;
BEGIN
while v_cnt <= 10 LOOP
DBMS_OUTPUT.put_line(v_cnt);
v_cnt := v_cnt + 1;
END LOOP;
END ;
FOR counter in [REVERSE] lower_bound ..upper_bound LOOP
statement1; statement2;
......
END LOOP;
BEGIN
FOR i IN 1..10 LOOP
Dbms_Output.put_line(i);
END LOOP;
END;
DECLARE
v_result INT;
BEGIN
<<outter>>
FOR i IN 1..5 LOOP
<<inter>>
FOR j IN 1 .. 5 LOOP
v_result := i;
EXIT outter WHEN i = 4;
END LOOP inner;
DBMS_OUTPUT.put_line('內:' || v_result);
END LOOP outter;
DBMS_OUTPUT.put_line('外:' || v_result);
END;
DECLARE
v_cnt INT :=1;
BEGIN
LOOP
DBMS_OUTPUT.put_line(v_cnt);
EXIT WHEN v_cnt = 10;
v_cnt := v_cnt + 1;
END LOOP;
END;
DECLARE
v_cnt INT := 0;
BEGIN
LOOP
v_cnt := v_cnt + 1;
CONTINUE WHEN v_cnt = 5;
DBMS_OUTPUT.put_line(v_cnt);
EXIT WHEN v_cnt = 10;
END LOOP;
END;
DECLARE
v_cnt INT := 1;
BEGIN
LOOP
DBMS_OUTPUT.put_line(v_cnt);
IF v_cnt = 10 THEN
GOTO end_loop;
END IF;
v_cnt := v_cnt + 1;
END LOOP;
<<end_loop>>
DBMS_OUTPUT.put_line('循環結束');
END;
BEGIN
SELECT ename, sal INTO v_name, v_sal FROM emp01 WHERE empno = &no;
IF v_sal < 3000 THEN
UPDATE emp01 SET comm = nvl(comm, 0) + sal * 0.2 WHERE ename = v_name;
COMMIT;
DBMS_OUTPUT.put_line(v_name || '的獎金更新了');
ELSE
NULL;
END IF;
END;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。