一、動態sql的拼接(使用replace)
注意使用replace替換達到動態sql拼接的效果,v_psql可做變數傳遞
1 declare
2 a number:=2;
3 v_sql varchar2(4000):='select ename from #';
4 v_psql varchar2(2000):='emp where rownum='||2||' ';
5 begin
6 dbms_output.put_line(v_psql);
7 v_sql:=replace(v_sql,'#',v_psql);
8 dbms_output.put_line(v_sql);
9* end;
sql> /
emp where rownum=2
select ename from emp where rownum=2
pl/sql 過程已成功完成。
二、通用的分隔函式(varchar2版本)
create or replace function split
( p_string varchar2,
p_sep varchar2 := ',' --預設按逗號分隔
) return type_split pipelined --pipelined關鍵字指定返回結果集使用管道輸出,輸出為表型別
is v_l pls_integer;
v_string varchar2(30000) := p_string;
begin
loop
v_l := instr(v_string,p_sep);
if v_l > 0 then
pipe row(substr(v_string,1,v_l-1)); --使用管道函式
v_string := substr(v_string,v_l+length(p_sep));
else
pipe row(v_string);
exit;
end if;
end loop;
return;
end split;
用之前記得建立乙個pl/sql表型別用來儲存輸出的結果:
create or replace type type_split is table of varchar2(1000)
用法:
select * from table(split('12,aa,qwwq,',','));
結果column_value
12aa
qwwq
null
通用的分隔函式(clob版本):
create or replace function splitclob(p_string in clob,
p_delimiter in varchar2)
return type_split
pipelined as
v_length number;
v_start number := 1;
v_index number;
begin
v_length := dbms_lob.getlength(p_string);
while (v_start <= v_length) loop
v_index := dbms_lob.instr(p_string, p_delimiter, v_start);
if v_index = 0 then
pipe row(dbms_lob.substr(p_string, v_length - 1, v_start));
v_start := v_length + 1;
else
pipe row(dbms_lob.substr(p_string, v_index - v_start, v_start));
v_start := v_index + 1;
end if;
end loop;
return;
end splitclob;
用法同上,唯一要注意的是要建立clob陣列來儲存輸出:
create or replace type type_split is table of clob
三、取得當前函式或儲存過程的名稱(一般用於錯誤處理)
create or replace function f_getprocname return varchar2
--獲取函式或者儲存過程自身的名稱及呼叫者
is l_owner varchar2(30);
l_name varchar2(30);
l_lineno number;
l_type varchar2(30);
begin
owa_util.who_called_me(l_owner, l_name, l_lineno, l_type);
return l_owner || '.' || l_name;
end;
用法
create or replace procedure p_test
a***_p01 exception;
...begin
...exception
when ex_p01 then
'在' || f_getprocname || '中出現錯誤:('||sqlcode||')--'||sqlerrm||',請檢查!');
...end p_test;
PL SQL程式設計方法大全
一 動態sql的拼接 使用replace 注意使用replace替換達到動態sql拼接的效果,v psql可做變數傳遞 1 declare 2 a number 2 3 v sql varchar2 4000 select ename from 4 v psql varchar2 2000 emp ...
PL SQL程式設計方法大全
pl sql程式設計方法大全 一 動態sql的拼接 使用replace www.2cto.com 注意使用replace替換達到動態sql拼接的效果,v psql可做變數傳遞 plain 1 declare 2 a number 2 3 v sql varchar2 4000 select enam...
PLSQL程式設計
create table emomy1 emon varchar2 100 time1 date drop table emomy1 select from emomy1 begin dbms output.put line hello,world end 定義變數 declare name con...