sqlplus的調用存儲過程
1. oracle 怎樣查看已經存在的函數,過程
工具sqlplus或者plsqldeveloper
方法一:sqlplus
①登錄用戶後,執行下面語句查看當前用戶有哪些存儲過程:
select name from user_source where type='PROCEDURE';
或者:
select object_name from user_proceres;
或者:
select object_name from user_objects where object_type='PROCEDURE' ;
②找到你所要查詢的存儲過程名字後,執行下面操作,可以看到存錯過程內容:
select text from user_source where name ='xxxx';--(xxxx代表所要查詢的存儲過程名字)
------------------------------------------------
如果是函數,類似的方法,只需要把PROCEDURE,換成FUNCTION即可
-----------------------------------------------
方法二:pl/sql developer
打開該工具後,在最左側可以看到如下截圖,選擇 My objects
2. 用sqlplus命令窗口執行oracle 存儲過程,關閉對話窗口後,存儲過程仍然執行
我測試過,如果中途中斷的話,存儲過程不會再執行。如果存儲過程裡面沒有寫commit的話數據就不會變更。
createorreplaceproceret_emp(resoutvarchar2)is
begin
foriin1..100000loop
insertintoemp(empno,ename,hiredate)values(i,'Sysuser'||to_char(i),sysdate);
--commit;
endloop;
res:='OK';
exception
whenothersthen
rollback;
res:='NG;'||SQLERRM;
end;
3. PL_sql如何執行oracle存儲過程
要成功執行這個存儲過程,你需要注意幾點:
1.select * from ods_area; 不能直接在pl/sql 中作為語句執行。
應該用 select 欄位 into plsql變數 from 表名;
的形式來獲取表中的數據,保存到plsql變數中。
2. 存儲過程的語法格式為:
create or replace procere area
is
--變數聲明;
begin
--過程主體;
end area;
3. 如果存儲過程代碼無誤,可以通過 "/" 來執行代碼,編譯存儲過程。
4.通過exec 或 execute 來調用編譯後的存儲過程。
例如:
-- 創建procere:
create or replace procere area
is
num number ;
v_areaRecord al%ROWTYPE;
begin
--例子1
select * into v_areaRecord from al;
--例子2
select 12345 into num from al;
end area;
/
-- 通過 / 執行;
--調用
exec area;
4. 存儲過程中的 procere、function和 package是干什麼的,需要詳細介紹
procere:過程
function:函數
package:包
一、過程
PL/SQL過程是一個編譯到oracle資料庫模式的單機程序。過程可以接受參數。當編譯一個過程時,CREATE PROCEDURE語句的過程標識符成為數
據字典中的對象名。
CREATE OR REPLACE PPROCEDURE procere_name (optional parameters) IS | AS
declarative part
BEGIN
program body
EXCEPTION
exception handler
END procere_name;
Declarative Part 是聲明變數的地方,比如:
local_counter NUMBER := 0;
也可以聲明復合類型結構,如records和tables
也可以聲明異常,但必須在Exception部門進行處理。
Subprogram Body 包含使用PL/SQL控制結構的邏輯演算法實現。PL/SQL控制結構支持loops、if-then-else、case、和聲明塊結構。
Exception handler 可選,類似於其他語言的try-catch模型,你可以對特定錯誤類型或一般異常編寫處理器.
應當以動詞來命名一個過程。過程常常執行一些操作如更新資料庫、寫數據到一個文件或者發送一條消息。
一個過程不必要有參數,如果沒有參數創建過程是不需要括弧。當調用一個過程時(過程沒有參數)括弧是可選的。
例如:
CREATE OR REPLACE PROCEDURE insert_temp IS
BEGIN
INSERT INTO TEMP (n) VALUES (0);
END insert_temp:
sqlplus調用過程:
SQL>execute insert_temp;
SQL>execute insert_temp();
都是正確的。
IS 或 AS關鍵字是一樣的,都可以用。
PROCEDURE insert_temp IS | AS
END關鍵字後加過程名也是可選的,但建議加過程名。一個過程可能跨越幾屏的長度,當滾屏時,有助於看到END子句知道沒有跳到下一個包過
程中。
完整的過程結構如下:
CREATE OR REPLACE PROCEDURE print_temp
IS
v_average NUMBER;
v_sum NUMBER;
BEGIN
SELECT AVG(n), SUM(n) INTO v_average, v_sum
FROM TEMP;
dbms_output.put_line('Average:'||v_average);
dbms_output.put_line('Sum:'||v_sum);
END print_temp;
二、函數
函數提供了獲取對象狀態和情形信息的手段,函數有返回值。
CREATE OR REPLACE FUNCTION student_status(optional parameters)
RETURN VARCHAR2 IS
declarative part
BEGIN
program body
RETURN expression;
EXCEPTION
exception handler code
that should include a RETURN
END student_student_status;
參數是可選的,但RETURN語句是必須的。FUNCTION必須有一個return 語句。
下面的例子是返回一個DATE類型的函數:
CREATE OR REPLACE FUNCTION tomorrow RETURN DATE
IS
next_day DATE;
BEGIN
next_day := SYSDATE + 1;
RETURN next_day;
END tomorrow;
函數中的return語句可以是一個表達式,上面函數可以直接返回一個表達式而不用本地變數:
FUNCTION tomorrow RETURN DATE IS
BEGIN
RETURN SYSDATE + 1;
END tomorrow;
函數於過程結果相似,只是函數返回值,而過程不返回值
三、包說明
1、語法和風格
包說明基本語法:
CREATE PACKAGE package_name IS
Type definitions for records, index-by tables,
varrays, nested tables
Constants
Exceptions
Global variable declarations
PROCEDURE procere_name_1 (parameters & types);
PROCEDURE procere_name_2 (parameter & types);
FUNCTION function_name_1 (parameters & types) RETURN type;
END package_name;
包說明中過程和函數沒有順序限制。
包主體將包含包說明中每一個子程序的PL/SQL代碼。包說明中的每一個子程序包體中必須有相應的子程序體。
在包說明中的數據對象聲明是全局的。因此,僅聲明需要全局定義的對象。
在包體內的過程語句,包括子程序名、參數名、參數模式、參數類型,必須匹配包說明中的過程語句。同樣,函數也是一樣。
包主體模板如下:
CREATE PACKAGE BODY package_name IS
PROCEDURE procere_name_1 (parameters & types)
IS
local variables
BEGIN
body of code
END procere_name_1;
PROCEDURE procere_name_2 (parameter & types)
IS
local variables
BEGIN
body_of_code
END procere_name_2;
FUNCTION function_name_1 (parameters & types) RETURN type
IS
local variables
BEGIN
body of code
RETURN statement;
END function_name_1;
END package_name;
2、示例:
CREATE OR REPLACE PACKAGE students_pkg IS
PROCEDURE add_student
(v_student_name IN students.student_name%TYPE,
v_college_major IN students.college_major%TYPE,
v_status IN students.status%TYPE,
v_state IN students.state%TYPE DEFAULT NULL,
v_license_no IN students.license_no%TYPE DEFAULT NULL);
FUNCTION NO_OF_STUDENTS
(v_major IN major_lookup.major_desc%TYPE DEFAULT NULL,
v_status IN students.status%TYPE DEFAULT NULL)
RETURN NUMBER;
END students_pkg;
四、包主體
下面是上例的包主體實現:
CREATE OR REPLACE PACKAGE BODY students_pkg IS
PROCEDURE add_student
(v_student_name IN students.student_name%TYPE,
v_college_major IN students.college_major%TYPE,
v_status IN students.status%TYPE,
v_state IN students.state%TYPE DEFAULT NULL,
v_license_no IN students.license_no%TYPE DEFAULT NULL)
IS
BEGIN
INSERT INTO students VALUES
('A'||students_pk_seq.NEXTVAL,
v_student_name,
v_college_major,
v_status,
v_state,
v_license_no);
END add_student;
FUNCTION NO_OF_STUDENTS
(v_major IN major_lookup.major_desc%TYPE DEFAULT NULL,
v_status IN students.status%TYPE DEFAULT NULL)
RETURN NUMBER
IS
ccount INTEGER;
BEGIN
SELECT COUNT (*) INTO ccount
FROM students, major_lookup
WHERE students.college_major = major_lookup.major
AND major_lookup.major_desc =
nvl(v_major,major_lookup.major_desc)
AND students.status = nvl(v_status,students.status);
RETURN ccount;
END NO_OF_STUDENTS;
END students_pkg;
開發包主體可能需要其他本地過程和函數,這些是隱藏的,叫私有(過程或函數)。
常常情況下要把一個單獨的過程放入一個新包或一個已存在包裡面。
PACKAGE temp_operations IS
PROCEDURE insert_temp;
END temp_operations;
PACKAGE BODY temp_operations IS
PROCEDURE insert_temp IS
BEGIN
INSERT INTO temp (n) VALUES (0);
END insert_temp;
END temp_operations;
使用下面方式調用:
temp_operations.insert_temp;
temp_operations.insert_temp();
http://yaoayao.javaeye.com/blog/710706
5. 問題一: java中調用oracle無參存儲過程報錯.問題二: sqlplus如何exec oracle帶out參數的存儲過程.
第二個問題:先申明out參數,再執行過程,記得過程中out參數前的冒號。
即:SQL> VAR PROLD2 VARCHAR;
SQL> EXEC PRO_selectById(proId1value,:PROLD2);
回車顯示PL/SQL procere successfully completed即表示執行成功。(注意proId1value表示入參的值)
6. oracle調用存儲過程,call和exec有什麼區別
oracle 中調用存儲過程可以用exec,或begin……end,但無法使用call。
但exec只可以在命令行下執行,如sqlplus下或plsql的命令窗口下執行,但begin……end可以用第三方工具或命令行下執行。
如圖:
命令下執行: