當前位置:首頁 » 服務存儲 » 新建存儲過程包
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

新建存儲過程包

發布時間: 2022-03-05 00:04:13

① oracle創建包、存儲過程

你的語句中有三處錯誤:一是as應該改為IS;二是不能光用一個SELECT語句,要麼用SELECT語句給變數賦值,要麼建立CURSOR;三是在SELECT語句後面用個COMMIT。舉個簡單例子,把系統日期賦值給變數aa:

create or replace procere test is
aa date;
begin
select sysdate into aa from al;
end ;

另外想告訴樓上的老兄,ORACLE中create or replace是常見的語句,不要覺得奇怪。

② oracle 創建存儲過程報錯, PACKAGE BODY SCOTT.EMP_SAL_MANAGEMENT 編譯錯誤

子程序或游標 'P_P_BONUS' 已在程序包說明中聲明, 必須在程序包體中對其進行定義。意思是你已經聲明了這個存儲過程P_P_BONUS,但是沒有在包體(PACKAGE BODY )中定義,就是你還需要在包體中定義P_P_Bonus的實現部分

③ oracle創建包和存儲過程

--創建包頭

CREATE OR REPLACE PACKAGE ELS.pkg_proxy
AS
TYPE cursortype IS REF CURSOR;

-- 得到交接確認代理人數據
PROCEDURE get_proxy_info (
v_emp_no IN VARCHAR2, --當前登錄用戶
v_to_emp_no IN VARCHAR2, --代理人工號
v_to_emp_name IN VARCHAR2, --代理人姓名
v_proxy_date1 IN VARCHAR2, --代理開始時間: yyyy/mm/dd
v_proxy_date2 IN VARCHAR2, --代理結束時間: yyyy/mm/dd
v_from_emp_no IN VARCHAR2, --被代理人工號
v_from_emp_name IN VARCHAR2, --被代理人姓名
p_cursor OUT cursortype
);
END pkg_proxy;

--創建包頭
CREATE OR REPLACE PACKAGE BODY ELS.pkg_proxy
AS
-- 得到交接確認代理人數據
PROCEDURE get_proxy_info (
v_emp_no IN VARCHAR2, --當前登錄用戶
v_to_emp_no IN VARCHAR2, --代理人工號
v_to_emp_name IN VARCHAR2, --代理人姓名
v_proxy_date1 IN VARCHAR2, --代理開始時間: yyyy/mm/dd
v_proxy_date2 IN VARCHAR2, --代理結束時間: yyyy/mm/dd
v_from_emp_no IN VARCHAR2, --被代理人工號
v_from_emp_name IN VARCHAR2, --被代理人姓名
p_cursor OUT cursortype
)
AS
BEGIN
OPEN p_cursor FOR
WITH v AS
(
--查找當前登錄人是否為管理員
SELECT *
FROM employee
WHERE dept_id IN (
SELECT ID
FROM department
START WITH ID =
(SELECT dept_id
FROM employee
WHERE emp_no = v_emp_no
AND is_admin IN (
SELECT r_value
FROM role_conditions
WHERE r_key =
'ProxySearch')
UNION
SELECT dept_id
FROM employee_add
WHERE emp_no = v_emp_no
AND is_admin IN (
SELECT r_value
FROM role_conditions
WHERE r_key =
'ProxySearch'))
CONNECT BY PRIOR ID = parent_id)
UNION
SELECT *
FROM employee
WHERE emp_no = v_emp_no)
SELECT DISTINCT *
FROM (SELECT a.currentuser, a.toagrentuser,
DECODE (a.agent_type,
'A', '當前交接確認代理',
'B', '將來離職簽核代理',
'C', '當前離職簽核代理',
'D', '將來交接確認代理',
''
) agent_type,
a.from_date, a.TO_DATE,
DECODE
(a.to_date1,
'', '無',
TO_CHAR (a.TO_DATE,
'yyyy/mm/dd am hh:mi:ss'
)
) to_date1,
a.flowinfo, b.emp_cname AS currentusername,
b1.emp_cname AS toagrentusername, workitem
FROM (
--當前交接確認代理
SELECT SUBSTR
(x.currentuser,
1,
INSTR (x.currentuser, '(') - 1
) AS currentuser,
SUBSTR
(x.toagrentuser,
1,
INSTR (x.toagrentuser, '(') - 1
) AS toagrentuser,
'A' AS agent_type,
x.create_date AS from_date,
x.create_date AS TO_DATE,
NULL AS to_date1, x.workid,
NULL AS formid, y.NAME workitem,
(SELECT e.emp_no
|| '('
|| e.emp_cname
|| ')'
FROM employee e
WHERE e.emp_no = y.emp_no)
AS flowinfo
FROM currentworkagrent x,
worktransferitem_m y
WHERE x.workid = y.ID
UNION ALL
--將來交接確認代理
SELECT SUBSTR
(currentuser,
1,
INSTR (currentuser, '(') - 1
) AS currentuser,
SUBSTR
(toagrent,
1,
INSTR (toagrent, '(') - 1
) AS toagrent,
'D' AS agent_type, starttime,
endtime, endtime AS to_date1, NULL,
NULL, NULL, NULL
FROM futureagrent) a,
employee b,
employee b1
WHERE a.currentuser = b.emp_no(+)
AND a.toagrentuser = b1.emp_no(+)) a
WHERE currentuser IN (SELECT emp_no
FROM v)
AND (currentuser = v_from_emp_no OR v_from_emp_no IS NULL
)
AND ( currentusername = v_from_emp_name
OR v_from_emp_name IS NULL
)
AND (toagrentuser = v_to_emp_no OR v_to_emp_no IS NULL)
AND ( toagrentusername = v_to_emp_name
OR v_to_emp_name IS NULL
)
AND from_date <=
TO_DATE (NVL (v_proxy_date2, '2099/12/31'),
'yyyy/mm/dd'
)
AND TO_DATE >=
TO_DATE (NVL (v_proxy_date1, '1000/12/31'),
'yyyy/mm/dd'
)
ORDER BY a.agent_type, a.from_date DESC;
END;
END pkg_proxy;

④ Oracle 怎麼指定我創建的存儲過程創建在我定義的包下

如下例子,你在定義包體的時候,同時定義存儲過程:

CREATE OR REPLACE PACKAGE BODY PACKXINEM8GL IS

PROCEDURE GL_CREATE_COMPANY_PARAMETER(UQCOMPANYID IN VARCHAR2,

STRDATE IN VARCHAR2,

UQACCOUNTSETID IN VARCHAR2,

STRISGMROLE IN VARCHAR2,

STRISFORCE IN VARCHAR2) IS

STRsql VARCHAR2(5000);

COMPID VARCHAR2(50);

STRGPDATE VARCHAR2(50);

STRYEARMONTH VARCHAR2(50); --啟用年月

⑤ 如何創建SQL存儲過程

步驟如下:

  1. 在對象資源管理器中,連接到某個資料庫引擎實例,再展開該實例。

  2. 展開「資料庫」、sql server存儲過程所屬的資料庫以及「可編程性」。

  3. 右鍵單擊「存儲過程」,再單擊「新建存儲過程」。

  4. 在「查詢」菜單上,單擊「指定模板參數的值」。

  5. 在「指定模板參數的值」對話框中,「值」列包含參數的建議值。接受這些值或將其替換為新值,再單擊「確定」。

  6. 在查詢編輯器中,使用過程語句替換 SELECT 語句。

  7. 若要測試語法,請在「查詢」菜單上,單擊「分析」。

  8. 若要創建sql server存儲過程,請在「查詢」菜單上,單擊「執行」。

  9. 若要保存腳本,請在「文件」菜單上,單擊「保存」。接受該文件名或將其替換為新的名稱,再單擊「保存」。

⑥ oracle怎麼創建存儲過程,怎麼將存儲過程打包

語法如下:
CREATE [ OR REPLACE ] PROCEDURE [ schema. ] procere_name
[ ( parameter_declaration [, parameter_declaration ]... ) ]
[ invoker_rights_clause ]
{ IS | AS }
{ [ declare_section ] body | call_spec | EXTERNAL} ;

例子:
CREATE PROCEDURE remove_emp (employee_id NUMBER) AS
tot_emps NUMBER;
BEGIN
DELETE FROM employees
WHERE employees.employee_id = remove_emp.employee_id;
tot_emps := tot_emps - 1;
END;
/

具體文檔:
http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_6009.htm#SQLRF01309
或搜索下

⑦ 如何在已有的包中添加存儲過程

創建包時,包分為兩個部分,包頭和body部分,在包頭部分聲明包內容,可以包括過程,函數啊等,body部分是包內容的詳細部分,你的過程就寫在body部分,找找包定義看看就知道了。

--------------------------------
這個簡單啊,再創建跟原來一樣的包名稱 用replace關鍵字啊!
create or replace package.....
資料庫在編譯時,會自動查找替換,就可以將procere加進去了!

⑧ 請問oracle如何在已經創建好的package和package body裡面創建存儲過程,謝謝

1、首先在package中定義存儲過程,具體如下:
CREATE OR REPLACE PACKAGE 包名
IS
PROCEDURE 存儲過程名1(參數定義);
PROCEDURE 存儲過程名2(參數定義);
......
END 包名;
2、其次在package body中具體實現即可。具體如下:
CREATE OR REPLACE PACKAGE BODY 包名
IS
PROCEDURE 存儲過程名1(參數定義)
IS
BEGIN
EXCEPTION
END 存儲過程名1;

PROCEDURE 存儲過程名2(參數定義)
IS
BEGIN
EXCEPTION
END 存儲過程名2;
END 包名;

⑨ oracle 如何在包和包體中添加新的存儲過程如何查看包的sql內容

先修改包頭,加入存儲過程聲明,然後再在包體中增加即可!
select text from dba_source where owner='xxx' and name='包名' and type='PACKAGE BODY'
order by line asc

⑩ 如何創建存儲過程

語法
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}

參數
trigger_name

是觸發器的名稱。觸發器名稱必須符合標識符規則,並且在資料庫中必須唯一。可以選擇是否指定觸發器所有者名稱。

Table | view

是在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。可以選擇是否指定表或視圖的所有者名稱。

WITH ENCRYPTION

加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發器作為 SQL Server 復制的一部分發布。

AFTER

指定觸發器只有在觸發 SQL 語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器。

如果僅指定 FOR 關鍵字,則 AFTER 是默認設置。

不能在視圖上定義 AFTER 觸發器。

INSTEAD OF

指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。

在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發器。然而,可以在每個具有 INSTEAD OF 觸發器的視圖上定義視圖。

INSTEAD OF 觸發器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項的可更新視圖添加 INSTEAD OF 觸發器,SQL Server 將產生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項後才能定義 INSTEAD OF 觸發器。

{ [DELETE] [,] [INSERT] [,] [UPDATE] }

是指定在表或視圖上執行哪些數據修改語句時將激活觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項。

對於 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關系的表上使用 UPDATE 選項。

WITH APPEND

指定應該添加現有類型的其它觸發器。只有當兼容級別是 65 或更低時,才需要使用該可選子句。如果兼容級別是 70 或更高,則不必使用 WITH APPEND 子句添加現有類型的其它觸發器(這是兼容級別設置為 70 或更高的 CREATE TRIGGER 的默認行為)。有關更多信息,請參見 sp_dbcmptlevel。

WITH APPEND 不能與 INSTEAD OF 觸發器一起使用,或者,如果顯式聲明 AFTER 觸發器,也不能使用該子句。只有當出於向後兼容而指定 FOR 時(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以後的版本將不支持 WITH APPEND 和 FOR(將被解釋為 AFTER)。

NOT FOR REPLICATION

表示當復制進程更改觸發器所涉及的表時,不應執行該觸發器。

AS

是觸發器要執行的操作。

sql_statement

是觸發器的條件和操作。觸發器條件指定其它准則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執行觸發器操作。

當嘗試 DELETE、INSERT 或 UPDATE 操作時,Transact-SQL語句中指定的觸發器操作將生效。

觸發器可以包含任意數量和種類的 Transact-SQL 語句。觸發器旨在根據數據修改語句檢查或更改數據;它不應將數據返回給用戶。觸發器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個特殊的表:

deleted 和 inserted 是邏輯(概念)表。這些表在結構上類似於定義觸發器的表(也就是在其中嘗試用戶操作的表);這些表用於保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用:
SELECT *
FROM deleted

如果兼容級別等於 70,那麼在 DELETE、INSERT 或 UPDATE 觸發器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發器中檢索新值,請將 inserted 表與原始更新表聯接。當兼容級別是 65 或更低時,對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長度字元串。
當兼容級別是 80 或更高時,SQL Server 允許在表或視圖上通過 INSTEAD OF 觸發器更新 text、ntext 或 image 列。

n

是表示觸發器中可以包含多條 Transact-SQL 語句的佔位符。對於 IF UPDATE (column) 語句,可以通過重復 UPDATE (column) 子句包含多列。

IF UPDATE (column)

測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用於 DELETE 操作。可以指定多列。因為在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個列上進行的 INSERT 或 UPDATE 操作,請在第一個操作後指定單獨的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。

說明 IF UPDATE (column) 子句的功能等同於 IF、IF...ELSE 或 WHILE 語句,並且可以使用 BEGIN...END 語句塊。有關更多信息,請參見控制流語言。

可以在觸發器主體中的任意位置使用 UPDATE (column)。

column

是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數據類型。但是,計算列不能用於該環境中。有關更多信息,請參見數據類型。

IF (COLUMNS_UPDATED())

測試是否插入或更新了提及的列,僅用於 INSERT 或 UPDATE 觸發器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。

COLUMNS_UPDATED 函數以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在表上創建的觸發器包含 8 列以上,則 COLUMNS_UPDATED 返回多個位元組,最左邊的為最不重要的位元組。在 INSERT 操作中 COLUMNS_UPDATED 將對所有列返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。

可以在觸發器主體中的任意位置使用 COLUMNS_UPDATED。

bitwise_operator

是用於比較運算的位運算符。

updated_bitmask

是整型位掩碼,表示實際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。

comparison_operator

是比較運算符。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實際進行了更新。使用大於號 (>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。

column_bitmask

是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列