基本语句
功能描述
存储过程支持两种基础语句:赋值语句和SQL语句。
赋值语句
- 语法格式
--对已声明的变量直接赋值。 variant_name := variant_expr;
- 参数说明
- variant_name
已声明变量的名字。必须为存储过程定义的变量或者输入参数。
- variant_expr
变量表达式,用于给已声明的变量赋值。变量表达式可以是普通变量表达式、函数和变量参加运算的表达式、CASE/WHEN表达式。
出现变量表达式中的变量优先匹配存储过程定义的变量,然后才会匹配表名或表的列名,因此需要避免存储过程定义的变量和表或者列重名;出现变量表达式中的函数优先匹配内置函数,然后才会匹配高级包,最后匹配自定义函数,因此需要注意避免自定义函数和内置函数或高级包重名。
- 示例
- 使用普通变量表达式赋值(以粗体显示)。
CREATE OR REPLACE PROCEDURE Zenith_Test_004(param1 in out varchar2) IS tmp varchar2(20) := '12345678'; BEGIN param1 := param1 || tmp; END Zenith_Test_004; /
- 使用函数和变量参加运算的表达式赋值(以粗体显示)。
CREATE OR REPLACE FUNCTION DATEADD( datepart VARCHAR2, num NUMBER, indate DATE) RETURN DATE IS Result DATE; v_sql VARCHAR2(1000); v_datepart VARCHAR2(30); v_ms VARCHAR2(13); BEGIN v_datepart := lower(datepart); CASE WHEN v_datepart IN ('year','yy','y') THEN v_sql := 'SELECT :1 + interval '''||num||''' year FROM SYS_DUMMY'; ELSE RAISE_APPLICATION_ERROR(-20001, ''''||datepart||''' is not a recognized dateadd option.' ); END CASE; EXECUTE IMMEDIATE v_sql into Result using indate; return(Result); END DATEADD; /
- 使用CASE/WHEN赋值表达式赋值(以粗体显示)。
DECLARE class CHAR(1) := 'S'; age VARCHAR2(15); BEGIN age := CASE class WHEN 'S' THEN '3-4 years' WHEN 'M' THEN '4-5 years' WHEN 'P' THEN '5-6 years' ELSE 'No such class' END ; DBMS_OUTPUT.PUT_LINE(age); END; /
SQL语句
存储过程目前支持七个SQL语句,分别为UPDATE、INSERT、DELETE、MERGE、SELECT ... INTO、COMMIT和ROLLBACK,这七个SQL语句可直接在存储过程中使用。其他SQL语句不能直接下发,必须通过动态SQL方式(EXECUTE IMMEDIATE)下发,否则会在存储过程编译时报错。动态SQL语句的详细信息请参见动态语句。
- 注意事项
- 所有DML语句使用的变量,会优先匹配存储过程中定义的变量,然后才会匹配表的列。因此,需要避免变量和列重名。
- 使用“SELECT ... INTO”语句时,如果关键字INTO后使用variant_list存放数据,则关键字SELECT后的column_list的列数必须和关键字INTO后variant_list的变量个数相同;但如果关键字INTO后不使用variant_list存放数据,而是使用一个记录变量存放数据,则没有此限制。此外,如果查询出不只一行记录,在使用“INTO { variant_list | record_variant }”赋值时会返回“ERR_TOO_MANY_ROWS”的错误;如果没有获取到行记录,在使用“INTO { variant_list | record_variant }”赋值时则会返回“NO_DATA_FOUND”的错误。
- 如果DML语句中的变量名与表名或列名重名,那么除以下变量外,DML语句中的其他变量会优先替换为存储过程定义的变量。
- 关键字UPDATE/INSERT INTO/DELETE FROM/SELECT FROM/MERGE INTO/USING后面跟的table_name。
- 关键字AS后面跟的别名。
- 关键字UPDATE SET后跟的column_name。
- "SELECT...INTO"语句中关键字INSERT后面跟的column_list。
- SQL语句中的变量优先匹配存储过程定义的变量,然后才会匹配表名或表的列名。避免存储过程定义的变量和表名或者列名重名
- SQL语句中使用的函数优先匹配内置函数,然后才会匹配高级包,最后匹配自定义函数。注意避免自定义函数和内置函数或高级包重名。
- 语法格式
- UPDATE语句。该语句的详细信息请参见UPDATE。
UPDATE table_name SET column = expression [ WHERE { CURRENT OF cursor_name | condition } ];
- INSERT语句。该语句的详细信息请参见INSERT。
INSERT INTO table_name { [ ( column_list ) ] VALUES ( values_list ) | select_statement };
- DELETE语句。该语句的详细信息请参见DELETE。
DELETE FROM table_name [ WHERE { CURRENT OF cursor_name | condition } ];
- MERGE语句。该语句的详细信息请参见MERGE。
MERGE INTO table_name USING table_name ON condition WHEN MATCHED THEN update_clause WHEN NOT MATCHED THEN insert_clause [ LIMIT limit_num OFFSET offset_num ];
- SELECT ... INTO语句。
SELECT { * | column_list } INTO { variant_list | record_variant } FROM table_name [ rest_of_select_statment ];
- rest_of_select_statment子句。SELECT语句的详细信息请参见SELECT。
[ WHERE { condition | [ NOT ] EXISTS ( correlated subquery ) } ] [ [START WITH condition ] CONNECT BY [ NOCYCLE ] [ PRIOR ] condition ] [ GROUP BY { column_name | number } [ , ... ] ] [ HAVING condition [ , ... ] ] [ { UNION [ ALL ] } select ] [ ORDER BY { column_name | number } [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ] [ , ... ] ] [ LIMIT [ offset_expr, ] count_expr | LIMIT count_expr OFFSET offset_expr | OFFSET offset_expr [ LIMIT count_expr ] ]
- COMMIT语句。该语句的详细信息请参见COMMIT。
COMMIT;
- ROLLBACK语句。该语句的详细信息请参见ROLLBACK。
ROLLBACK;
- 示例
- 准备数据(创建表T_PROC_1 并插入数据)。
--删除已存在的同名表。 DROP TABLE IF EXISTS T_PROC_1;
--创建表T_PROC_1。 CREATE TABLE T_PROC_1 (f_int1 INTEGER,f_int2 INTEGER, f_int3 INTEGER, f_bigint1 BIGINT, f_bigint2 BIGINT, f_bigint3 BIGINT, f_bool1 INTEGER, f_bool2 INTEGER, f_num1 NUMBER(38, 0),f_num2 NUMBER(38, 0), f_dec1 DECIMAL(38, 0), f_dec2 DECIMAL(38, 0), f_num10 NUMBER(38, 10), f_dec10 DECIMAL(38, 10), f_float FLOAT,f_double DOUBLE, f_real REAL, f_char1 CHAR(128),f_char2 CHAR(128), f_varchar1 VARCHAR(512),f_varchar2 VARCHAR2(512), f_date1 DATE, f_date2 DATE, f_time DATE, f_timestamp TIMESTAMP);
--向表T_PROC_1中插入数据。 INSERT INTO T_PROC_1 VALUES(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,'a','b','c','d','2017-01-01','2017-01-01','2017-01-01','2017-01-01'); --提交事务。 COMMIT;
- UPDATE语句(以粗体显示)。
DECLARE A INT; B INT; BEGIN UPDATE T_PROC_1 SET F_INT1 = 2 WHERE F_INT1 = 1; A := SQL%ROWCOUNT; EXECUTE IMMEDIATE 'UPDATE T_PROC_1 SET F_INT1 = 3 WHERE F_INT1 = 2'; B := SQL%ROWCOUNT; INSERT INTO T_PROC_1(F_INT1,F_INT2) VALUES(A,B); COMMIT; END; /
- INSERT语句(以粗体显示)。
DECLARE A INT; B INT; BEGIN INSERT INTO T_PROC_1(F_INT1) VALUES(12); INSERT INTO T_PROC_1(F_INT1) VALUES(12); A := SQL%ROWCOUNT; EXECUTE IMMEDIATE 'DELETE FROM T_PROC_1'; B := SQL%ROWCOUNT; INSERT INTO T_PROC_1(F_INT1,F_INT2) VALUES(A,B); ROLLBACK; END; /
- DELETE语句(以粗体显示)。
DECLARE a INT; BEGIN a := 1; UPDATE T_PROC_1 SET f_int1 = f_int1 + 11 WHERE f_int1 = 1; DELETE FROM T_PROC_1 WHERE f_int1 = 1; SELECT f_int1 INTO a FROM T_PROC_1 LIMIT 1; COMMIT; DBMS_OUTPUT.PUT_LINE('result is:' || a); END; /
- MERGE语句(以粗体显示)。
DECLARE A INT; B INT; BEGIN MERGE INTO T_PROC_1 USING SYS_DUMMY ON (1=1) WHEN MATCHED THEN UPDATE SET F_INT1 = 2; A := SQL%ROWCOUNT; EXECUTE IMMEDIATE 'MERGE INTO T_PROC_1 USING SYS_DUMMY ON (1=0) WHEN NOT MATCHED THEN INSERT (F_INT1) VALUES(1)'; B := SQL%ROWCOUNT; INSERT INTO T_PROC_1(F_INT1,F_INT2) VALUES(A,B); END; /
- SELECT语句(以粗体显示)。
DECLARE a INT; BEGIN a := 1; UPDATE T_PROC_1 SET f_int1 = f_int1 + 11 WHERE f_int1 = 1; DELETE FROM T_PROC_1 WHERE f_int1 = 1; SELECT f_int1 INTO a FROM T_PROC_1 LIMIT 1; COMMIT; DBMS_OUTPUT.PUT_LINE('result is:' || a); END; /
- COMMIT/ROLLBACK语句(以粗体显示)。
DECLARE a INT; BEGIN MERGE INTO T_PROC_1 USING SYS_DUMMY ON (f_int1 = 2) WHEN NOT MATCHED THEN INSERT (f_int1) VALUES(2); SELECT f_int1 INTO a FROM T_PROC_1 LIMIT 1; IF (a = 2) THEN COMMIT; ELSE ROLLBACK; END IF; END; /
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论
- UPDATE语句(以粗体显示)。
- 准备数据(创建表T_PROC_1 并插入数据)。
- COMMIT语句。该语句的详细信息请参见COMMIT。
- MERGE语句。该语句的详细信息请参见MERGE。
- INSERT语句。该语句的详细信息请参见INSERT。
- UPDATE语句。该语句的详细信息请参见UPDATE。
- 注意事项
- 使用函数和变量参加运算的表达式赋值(以粗体显示)。
- 参数说明