用create procedure命令建立存储过程,语法如下:
create [or replace] procedure 过程名(参数列表)
as -- as不可以省略
PLSQL子程序体;
注意事项:
create or replace procedure sayHello
as
begin
dbms_output.put_line('HelloWorld');
end;
/
调用方式:
SQL> set serveroutput on;
SQL> exec sayHello;
SQL> set serveroutput on;
SQL> call sayHello();
SQL> set serveroutput on;
SQL> begin
sayHello;
end;
/
create or replace procedure addSal(pempno in emp.empno%type)
as
pename emp.ename%type;
beforesal emp.sal%type;
aftersal emp.sal%type;
begin
select ename,sal into pename,beforesal from emp where empno=pempno;
aftersal:=beforesal+100;
update emp set sal=aftersal where empno=pempno;
dbms_output.put_line('姓名: '||pename||' 涨前工资:'||beforesal||'涨后工资:'||aftersal);
end;
/
SQL> set serveroutput on;
SQL> begin
2 addSal(7782);
3 addSal(7788);
4 commit;
5 end;
6 /
姓名:CLARK 涨前工资:7608.87 涨后工资:7708.87
姓名:SCOTT 涨前工资:7263.4 涨后工资:7363.4
注意事项:
create [or replace] function 函数名(参数列表)
return 函数值类型
as
PLSQL子程序体;
注意事项:
create or replace function queryempannal(pempno in number)
return number
as
psal emp.sal%type;
pcomm emp.comm%type;
begin
select sal,comm into psal,pcomm from emp where empno=pempno;
return psal*12+nvl(pcomm,0);
end;
create or replace procedure queryempinform(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2 )
as
begin
select ename,sal,job into pename,psal,pjob from emp where empno=eno;
end;
/
CREATE OR REPLACE FUNCTION blob_to_clob2 (blob_in IN BLOB)
RETURN CLOB
AS
v_clob CLOB;
v_varchar VARCHAR2(32767);
v_start PLS_INTEGER := 1;
v_buffer PLS_INTEGER := 32767;
BEGIN
DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
if DBMS_LOB.GETLENGTH(blob_in) is null then
return empty_clob();
end if;
FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer)
LOOP
v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start));
DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
v_start := v_start + v_buffer;
END LOOP;
RETURN v_clob;
END blob_to_clob2;
# 使用场景一:表中存在两个字段,一个字段类型为blob,一个字段类型为clob。将blob类型的字段进行转换,并存入clob字段中。
UPDATE 表名 set clob字段名 = blob_to_clob2(blob字段名)
create or replace FUNCTION blob_to_varchar (blob_in IN BLOB)
RETURN VARCHAR2
IS
v_varchar VARCHAR2(4000);
v_start PLS_INTEGER := 1;
v_buffer PLS_INTEGER := 4000;
BEGIN
--select userenv('LANGUAGE') into g_nls_db_char from dual;
if DBMS_LOB.GETLENGTH(blob_in) is null then
return empty_clob();
end if;
DBMS_OUTPUT.put_line('TEST:' || CEIL(DBMS_LOB.GETLENGTH(blob_in)));
--DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer)
LOOP
v_varchar := UTL_RAW.CAST_TO_VARCHAR2(utl_raw.convert(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start),'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', 'AMERICAN_THE NETHERLANDS.UTF8'));
--DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
v_start := v_start + v_buffer;
END LOOP;
--DBMS_OUTPUT.put_line(v_varchar);
RETURN v_varchar;
end blob_to_varchar;
# 使用场景一:表中存在两个字段,一个字段类型为blob,一个字段类型为varchar。将blob类型的字段进行转换,并存入varchar字段中。
UPDATE 表名 set varchar字段名 = blob_to_varchar(blob字段名)
CREATE OR REPLACE FUNCTION base64encode(p_blob IN BLOB)
RETURN CLOB
IS
l_clob CLOB;
l_step PLS_INTEGER := 12000;
BEGIN
FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_blob) - 1 )/l_step) LOOP
l_clob := l_clob || UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(p_blob, l_step, i * l_step + 1)));
END LOOP;
RETURN l_clob;
END ;
/