sqlplus呼叫包package中輸入引數為plsql索引表和plsql巢狀表示例
----包
create or replace package pack_special is
-- Author : ADMINISTRATOR
-- Created : 2011-12-1 14:57:57
-- Purpose :
-- Public type declarations
type t_deptno is table of dept.deptno%type index by binary_integer;
type t_dname is table of dept.dname%type index by binary_integer;
--in_deptno t_deptno;
--out_dname t_dname;
procedure proc_special(in_deptno in t_deptno);
end pack_special;
--包體
create or replace package body pack_special
is
procedure proc_special(in_deptno in t_deptno)
is
lvnctl integer;
v_dname dept.dname%type;
begin
lvnctl:=1;
while lvnctl<=4 loop
select dname
into v_dname
from dept
where dept.deptno =in_deptno(lvnctl);
dbms_output.put_line(v_dname);
lvnctl:=lvnctl+1;
end loop;
end proc_special;
end pack_special;
--透過sqlplus呼叫輸入引數為索引表(下標可為負數,且元素個數不限制,且其不能直接在table中作為表列型別使用)
SQL> declare
2 in_deptno pack_special.t_deptno;--直接引用package包中包plsql索引表型別
3 begin
4 in_deptno(1):=10;
5 in_deptno(2):=20;
6 in_deptno(3):=30;
7 in_deptno(4):=40;
8 pack_special.proc_special(in_deptno);
9 end;
10 /
PL/SQL procedure successfully completed
小結:plsql索引表在包中定義的plsql索引表與在sqlplus宣告的plsql索引表型別即便名稱相同,也不是同一個型別
plsql索引表好像不能直接為其plsql索引表變數賦值,
如:in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
而只能in_deptno(1):=10;
5 in_deptno(2):=20;
6 in_deptno(3):=30;
7 in_deptno(4):=40;
否則報錯如下:
declare
in_deptno pack_special.t_deptno;
in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
begin
--in_deptno(1):=10;
--in_deptno(2):=20;
--in_deptno(3):=30;
--in_deptno(4):=40;
pack_special.proc_special(in_deptno);
end;
ORA-06550: 第 3 行, 第 34 列:
PLS-00222: 在此範圍中不存在名為 'T_DEPTNO' 的函式
ORA-06550: 第 3 行, 第 11 列:
PL/SQL: Item ignored
ORA-06550: 第 9 行, 第 27 列:
PLS-00371: 'IN_DEPTNO' 最多允許有一個宣告
ORA-06550: 第 9 行, 第 1 列:
PL/SQL: Statement ignored
而如果使用plsql巢狀表,就可以測試透過
如下:
SQL> declare
2 in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
3 begin
4 pack_special.proc_special(in_deptno);
5 end;
6 /
PL/SQL procedure successfully completed
其對應儲存過程調整如下:
--包
create or replace package pack_special is
-- Author : ADMINISTRATOR
-- Created : 2011-12-1 14:57:57
-- Purpose :
-- Public type declarations
type t_deptno is table of dept.deptno%type; --注意:plsql巢狀表定義僅比plsql
type t_dname is table of dept.dname%type;
--in_deptno t_deptno;
--out_dname t_dname;
procedure proc_special(in_deptno in t_deptno);
end pack_special;
--包體
create or replace package body pack_special
is
procedure proc_special(in_deptno in t_deptno)
is
lvnctl integer;
v_dname dept.dname%type;
begin
lvnctl:=1;
while lvnctl<=4 loop
select dname
into v_dname
from dept
where dept.deptno =in_deptno(lvnctl);
dbms_output.put_line(v_dname);
lvnctl:=lvnctl+1;
end loop;
end proc_special;
end pack_special;
小結:plsql巢狀表型別可以直接批次賦值in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
plsql巢狀表型別可以直接作為表列型別使用
plsql巢狀表型別從語法上區別於plsql索引表型別,少了一個 index by binary_integer
plsql巢狀表型別下標從1開始,元素個數為無限
create or replace package pack_special is
-- Author : ADMINISTRATOR
-- Created : 2011-12-1 14:57:57
-- Purpose :
-- Public type declarations
type t_deptno is table of dept.deptno%type index by binary_integer;
type t_dname is table of dept.dname%type index by binary_integer;
--in_deptno t_deptno;
--out_dname t_dname;
procedure proc_special(in_deptno in t_deptno);
end pack_special;
--包體
create or replace package body pack_special
is
procedure proc_special(in_deptno in t_deptno)
is
lvnctl integer;
v_dname dept.dname%type;
begin
lvnctl:=1;
while lvnctl<=4 loop
select dname
into v_dname
from dept
where dept.deptno =in_deptno(lvnctl);
dbms_output.put_line(v_dname);
lvnctl:=lvnctl+1;
end loop;
end proc_special;
end pack_special;
--透過sqlplus呼叫輸入引數為索引表(下標可為負數,且元素個數不限制,且其不能直接在table中作為表列型別使用)
SQL> declare
2 in_deptno pack_special.t_deptno;--直接引用package包中包plsql索引表型別
3 begin
4 in_deptno(1):=10;
5 in_deptno(2):=20;
6 in_deptno(3):=30;
7 in_deptno(4):=40;
8 pack_special.proc_special(in_deptno);
9 end;
10 /
PL/SQL procedure successfully completed
小結:plsql索引表在包中定義的plsql索引表與在sqlplus宣告的plsql索引表型別即便名稱相同,也不是同一個型別
plsql索引表好像不能直接為其plsql索引表變數賦值,
如:in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
而只能in_deptno(1):=10;
5 in_deptno(2):=20;
6 in_deptno(3):=30;
7 in_deptno(4):=40;
否則報錯如下:
declare
in_deptno pack_special.t_deptno;
in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
begin
--in_deptno(1):=10;
--in_deptno(2):=20;
--in_deptno(3):=30;
--in_deptno(4):=40;
pack_special.proc_special(in_deptno);
end;
ORA-06550: 第 3 行, 第 34 列:
PLS-00222: 在此範圍中不存在名為 'T_DEPTNO' 的函式
ORA-06550: 第 3 行, 第 11 列:
PL/SQL: Item ignored
ORA-06550: 第 9 行, 第 27 列:
PLS-00371: 'IN_DEPTNO' 最多允許有一個宣告
ORA-06550: 第 9 行, 第 1 列:
PL/SQL: Statement ignored
而如果使用plsql巢狀表,就可以測試透過
如下:
SQL> declare
2 in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
3 begin
4 pack_special.proc_special(in_deptno);
5 end;
6 /
PL/SQL procedure successfully completed
其對應儲存過程調整如下:
--包
create or replace package pack_special is
-- Author : ADMINISTRATOR
-- Created : 2011-12-1 14:57:57
-- Purpose :
-- Public type declarations
type t_deptno is table of dept.deptno%type; --注意:plsql巢狀表定義僅比plsql
type t_dname is table of dept.dname%type;
--in_deptno t_deptno;
--out_dname t_dname;
procedure proc_special(in_deptno in t_deptno);
end pack_special;
--包體
create or replace package body pack_special
is
procedure proc_special(in_deptno in t_deptno)
is
lvnctl integer;
v_dname dept.dname%type;
begin
lvnctl:=1;
while lvnctl<=4 loop
select dname
into v_dname
from dept
where dept.deptno =in_deptno(lvnctl);
dbms_output.put_line(v_dname);
lvnctl:=lvnctl+1;
end loop;
end proc_special;
end pack_special;
小結:plsql巢狀表型別可以直接批次賦值in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
plsql巢狀表型別可以直接作為表列型別使用
plsql巢狀表型別從語法上區別於plsql索引表型別,少了一個 index by binary_integer
plsql巢狀表型別下標從1開始,元素個數為無限
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-712557/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PLSQL Language Referenc-巢狀表-巢狀表和陣列間的重要區別(正確地使用巢狀表)SQL巢狀陣列
- PLSQL Language Referenc-PL/SQL集合和記錄-巢狀表SQL巢狀
- oracle 巢狀表 索引表 使用Oracle巢狀索引
- PLSQL Language Referenc-PL/SQL集合和記錄-使用Multiset Conditions比較巢狀表SQL巢狀
- PLSQL Language Referenc-PL/SQL集合和記錄-集合比較-比較巢狀表是否相等SQL巢狀
- PLSQL Language Referenc-PL/SQL集合和記錄-集合比較-和NULL比較可變陣列和巢狀表變數SQLNull陣列巢狀變數
- 觸發器trigger中呼叫包package(包中含:儲存過程procedure及函式function)_plsql觸發器Package儲存過程函式FunctionSQL
- PLSQL Language Referenc-PL/SQL集合和記錄-集合變數賦值-將集合操作結果賦給巢狀表SQL變數賦值巢狀
- 在sqlplus中呼叫in out輸入輸出引數的儲存過程SQL儲存過程
- PLSQL Language Referenc-PL/SQL集合和記錄-集合變數賦值-給可變陣列和巢狀表賦NULL值SQL變數賦值陣列巢狀Null
- sqlplus 可以登入 plsql 不能登入SQL
- PLSQL Language Referenc-PL/SQL子程式-巢狀、包和獨立的儲存子程式SQL巢狀
- Oracle vs PostgreSQL Develop(27) - PLSQL vs PLPGSQL(輸出引數)OracleSQLdev
- 業務中出現plsql打頭的表_plsql_profilter_runsSQLFilter
- 表為多列為null的表之索引示例Null索引
- oracle巢狀表Oracle巢狀
- Oracle 巢狀表Oracle巢狀
- PLSQL只匯出表結構SQL
- 利用PLSQL包載入CLOB欄位SQL
- plsql下nocopy引數的含義SQL
- Oracle 巢狀表(轉)Oracle巢狀
- PLSQL包和TYPE參考手冊SQL
- 評論表設計 - 路徑列舉、巢狀集、閉包表巢狀
- PLSQL來Oracle建立表空間和建立使用者SQLOracle
- PLSQL學習-【9包】SQL
- 巢狀表在表定義中的使用:一個例子巢狀
- java uid及plsql呼叫JavaUISQL
- element-ui的----el-form表單校驗巢狀表單校驗(表單多層巢狀)+el-table和el-form巢狀使用表單校驗UIORM巢狀
- 在oracle的plsql中為cursor使用繫結變數OracleSQL變數
- 【react】實現動態表單中巢狀動態表單React巢狀
- PLSQL的變數SQL變數
- sqlplus能登入資料庫,但plsql登入不上SQL資料庫
- js中的函式巢狀和閉包JS函式巢狀
- 關於plsql表的一段程式碼SQL
- plsql_提取一個表多個列之和SQL
- PLSQL 呼叫 返回 遊標(Cursor)PROCEDURESQL
- 巢狀表的測試(一)巢狀
- 巢狀表的測試(二)巢狀