oracle存储过程
Oracle存储过程
1、无参,最简单存储过程
CREATE OR REPLACE PROCEDURE HELLO_WORLD IS
BEGIN DBMS_OUTPUT.PUT_LINE('Hello, World!');
END HELLO_WORLD;
输出
Hello, World!
2、输出查询语句
创建源数据
存储过程语句(求总薪资)
CREATE OR REPLACE PROCEDURE sum_salary
is
v_sum salary.salary%TYPE:=0;
CURSOR CURSOR_p IS SELECT salary FROM salary;
BEGIN FOR v_cursor IN CURSOR_p LOOPv_sum:=v_sum+v_cursor.salary;END LOOP;DBMS_OUTPUT.PUT_LINE('v_sum:'||v_sum);
END;
调用存储过程
BEGIN
sum_salary;
END;
命令行调用
exec zhang.sum_salary;
输出结果
v_sum:71000
SQL> exec zhang.sum_salary;
v_sum:71000
有参数调用
建表源数据
存储过程(有参数)
CREATE OR REPLACE PROCEDURE sum_salary
is
v_sum salary.salary%TYPE:=0;
CURSOR CURSOR_p IS SELECT salary FROM salary;
BEGIN FOR v_cursor IN CURSOR_p LOOPv_sum:=v_sum+v_cursor.salary;END LOOP;DBMS_OUTPUT.PUT_LINE('v_sum:'||v_sum);
END;
调用存储过程1
DECLARE
inp_continent PEOPLE.continent%TYPE;
resultpo PEOPLE.POPULATION%TYPE;
BEGINinp_continent:='Europ';sum_salary_1(inp_continent,resultpo);DBMS_OUTPUT.PUT_LINE('result:'||resultpo);
END;
输出结果
result:14000
调用存储过程2
DECLARE
inp_continent PEOPLE.continent%TYPE;
resultpo PEOPLE.POPULATION%TYPE;
BEGINinp_continent:='EUROP';sum_salary_1(inp_continent,resultpo);DBMS_OUTPUT.PUT_LINE('result:'||resultpo);
END;
输出结果
result:40000
3、调用方式
CALL PROCEDURE_NAME: 是SQL标准的一部分,适用于在SQL命令行工具中调用存储过程,在调用存储过程时,可以传递输入参数和输出参数。
BEGIN …END :块是PL/SQL中的一种结构,提供了更大的灵活性和功能,适用于需要在调用存储过程的同时执行其他PL/SQL代码的情况,调用存储过程时,同样需要使用括号传递参数
EXECUTE PROCEDURE_NAME:是Oracle特有的,用于执行存储过程或函数,通常用于简单的存储过程调用,在使用EXECUTE语句时,可以传递输入参数,但通常不用于获取输出参数(尽管技术上可能)
存储过程(输入参数)
CREATE OR replace PROCEDURE create_table_de
IS
sql_statement varchar(300);
BEGINsql_statement:='CREATE TABLE user_info24(id NUMBER,name varchar(20),address varchar(20))';EXECUTE IMMEDIATE sql_statement;
DBMS_OUTPUT.PUT_LINE('TABLE CREATED SUCCESSFULLY!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR OCCURRED:'||SQLERRM);
END;
调用
CALL create_table_de();
TABLE CREATED SUCCESSFULLY!
创建插入数据存储过程
CREATE OR REPLACE PROCEDURE insert_tb(
table_name IN VARCHAR2,
column_values IN VARCHAR2
)
IS
sql_statament varchar(200);
BEGINsql_statament:='INSERT INTO'||table_name||'values('||column_definitions||')';execute immediate sql_statament;DBMS_OUTPUT.PUT_LINE('INSERT SUSCESSFULLY!');EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('ERROR OCCURRED:'||SQLERRM);
END;
调用
CALL insert_tb('user_info24','5,''zhang'',''guangzhou''');
注意:字段值使用的是两个单引号