oracle編譯包體
1. Oracle 包體太大如何編譯
慢慢編譯
,沒別的法子。
2. oracle包與包體的區別
oracle包包含包的說明(包頭)和包體,包頭聲明對外可用的函數的聲明、過程的聲明、變數等,包體包含包的實現,如專用變數、函數的實現、過程的實現等。
3. oracle 編譯包的時候,一直提示正在編譯
編譯的存儲過程的時候,程序死住,等待一會出現ora-04021錯誤解決辦法:
1.可能被鎖住
查看v$lockedselect b.sid,b.serial#,b.machine,b.terminal,b.program,b.process,b.status from v$lock a , v$session b
where a.SID = b.SID
得到死鎖session的SID,SERIAL#參看這個是否為你自己用戶下的,然後kill掉session
2.可能被掛起
查看v$session_waitselect b.serial#,a.* from v$session_wait a,v$session
bwhere a.sid = b.sid得到等待的session的sid和serial#3.查看dba_ddl_locksselect
session_id sid, owner, name, type,
mode_held held, mode_requested request
from dba_ddl_locks
where name = '&your_package_name'
4. oracle中的包 和 包體 是干什麼的我不太懂,是經常用嗎
包和包體要合起來算一個東西!~
包頭裡面都是放一些定義!~
而包體才是這個包頭定義裡面的具體東西!~
包裡面可以有好幾個函數 和存儲過程!~
使用的時候調用 包名.函數名 包名.存儲過程名 都可以的!~
一般我們都是在包里寫一個主函數 在程序里調用 然後主函數里寫調用其他函數和存儲過程!~
5. oracle如何批量編譯包體
sql">alterpackageusername.xxxxcompilebody;
語法如上
6. 求看看這個ORACLE包體編譯的時候提示必須聲明標識符emp,我該怎麼聲明它呀
emp表是oracle安裝包里的example,它屬於scott,確認一下這個表是否存在:
select owner,object_type from dba_objects where object_name='EMP';
如果這個表存在,出現這個錯誤,有以下幾個原因:
1.這個包的所有者沒有對emp表的select許可權
2.雖然有許可權,但在引用它的時候必需明確這個表的schema,也就是上面那個查詢的owner,你應該用scott.emp
7. oracle 中的包是什麼
在一個大型項目中,有很多模塊,每個模塊都可能有很多的過程和函數,這些過程和函數默認就是放在一起,不方便查詢和維護,甚至會發生誤刪除的事件。
所以通過使用包,就可以分類管理過程和函數。
使用包還有一個好處,就是可以在包中定義自定義類型,從而在過程和函數可以直接用於定義變數。
包的概念與java程序中包的概念是非常類似的,java程序中包也是為了分類管理不同的類,關鍵字都是package。
(1)包的意義
PL/SQL為了滿足程序模塊化的需要,除了塊(block)和子程序結構外,還引入了包的構造。
包是一種資料庫對象,將邏輯上相關的PL/SQL類型、對象和子程序組合成一個更大的單位。包有兩個部分:包說明(specification)和包體(body)。說明部分是為應用程序的介面,它申明類型、常量、例外、游標和可用的子程序。體定義游標和子程序,實現說明。應用程序僅對包說明中的申明是可見的和可存取。如果ORACLE具有Procere選件,包可以編譯、存貯在ORACLE資料庫中,其內容可為許多應用共享。當用戶第一次調用一包裝的子程序時,整個包裝入到內存,所以在以後對包中子程序調用時,不再需要I/O操作,故包可提高效率和改進性能。
PL/SQL的包具有信息隱蔽性(information hiding),僅在演算法和數據結構設計有關層可見。在前面講到的過程中,可將過程說明和過程體組成一個程序單位。也可將過程說明與它的過程體分開,在這種情況下,將過程放置在一個包中,可隱蔽實現的細節。也可在包中定義過程,而該過程在包說明中沒有定義過程說明,這樣定義的過程僅在包內使用。
(2)包的定義
包的定義形式如下:
包說明:
PACKAGE 包名 IS
--變數說明;
--游標說明;
--例外說明;
--記錄說明;
--Plsql表說明;
--過程說明;
--函數說明;
END[包名];
包體:
PACKAGE BODY 包名 IS
--變數名說明;
--游標說明;
--游標申明;
--例外說明;
--記錄說明;
--plsql說明;
--過程體;
--函數體;
BEGIN
--語句序列
END[包名];
其中,包名為命名包的標識符。
包不能嵌入在PL/SQL塊或子程序中,然而使用支持PL/SQL的任何工具可定義包。要使包為全體使用,必須用CREATE命令建立,存貯在一個ORACLE資料庫中。可在SQL*PLUS、SQL*DBA或從ORACLE預編譯宿主程序中利用CREATE PACKAGE和CREATE PACKAGE BODY 語句建立。
例 2.52: 建立包:
.包說明建立
CREATE PACKAGE emp_actions AS
TYPE EMPRECTYP IS RECORD(emp_id INTEGER,salary REAL);
CURSOR desc_salary(emp_id NUMBER)RETURN EMPRECTYP;
PROCEDURE hire_employee
(ename CHAR,
job CHAR,
sal NUMBER,
mgr NUMBER,
comm NUMBER,
deptno NUMBER;
PROCEDURE fire_employee(emp_id NUMBER);
END emp_actions;
(A):其中語句TYPE EMPRECTYP IS RECORD(emp_id. INTEGER,Salary REAL)是指用戶定義EMPRECTYP為RECORD(記錄)類型對象。用戶定義記錄
的一般格式是:
TYPY 類型名 IS RECORD
(欄位名1{欄位類型|變數名%TYPE|表名.列名%TYPE|表名%ROWTYPE}[NOT NULL],
欄位名2{欄位類型|變數名%TYPE|表名.列名%TYPE|表名%ROWTYPE}[NOT NULL],...);其中:類型名為類型說明符,可在記錄說明中使用。欄位
類型為PL/SQL允許的任何數據類型,包括RECORD類型和TABLE(表)類型。可用%TYPE或%ROWTYPE屬性指定一欄位的數據類型。
利用%TYPE屬性可提供變數,常量或資料庫列的數據類型。例如變數my_dname是同SCOTT的DEPT表的DNAME列類型相同,則可如下定義:
my_dname SCOTT.dept.danme%TYPE ,%ROWTYPE屬性提供一記錄類型,它表示一表(或視圖)中的一行。記錄可存貯由表所選擇的一整行或者由
一游標所獲取的一整行。例如:
DECLARE
emp_rec emp% ROWTYPE;
CURSOR C1 IS SELECT deptno,dname,loc FROM dept;
dept_rec C1%ROWTYPE;
其中 emp_rec記錄可存貯從表EMP中選擇的行,dept_rec記錄可存貯由C1游標所獲取的行。這樣定義的記錄中的欄位與行中列有相同的名和相同數據類型。記錄中的欄位可以下列形式引用:
記錄名.欄位名
emp_rec.ename:=』JOHNSON』;
8. 請問ORACLE 中的包、包體 是做什麼的用什麼用處
oracle資料庫中:用的最多的是表(table),表裡面用於存儲數據。起到資料庫的作用。
包和包體一般是不可分的,包中定義變數;包體中書寫操作程序。(備註:在資料庫端得包體中編寫資料庫操作代碼,簡單,快捷,方便)。
前台只需要調用oracle的包體函數就可以實現該包體中的資料庫操作語言,完成數據存儲,修改,刪除,等等功能。
除上述以外還有:視圖,觸發器,隊列,資料庫連接等等。
總之,oracle非常好用!!!!
------包體類似於C語言的公共類函數。
9. Oracle 怎麼根據包頭生成包體
包頭
create or replace package package_name is
prcere p1;
prcere p2(v1 in char, v2 in date);
end package_name;
包體
create or replace package body package_name is
prcere p1 is
begin
--代碼省略
end p1;
prcere p2(v1 in char, v2 in date) is
begin
--代碼省略
end p2;
end package_name;
10. Oracle 創建包體以後,包體報錯!
這種情況下flower用戶應該不能通過角色傳遞來得到對ehr用戶表的訪問許可權,需要直接賦予對ehr用戶那些表的select許可權