存儲過程isinvalid
A. Oracle 定義存儲過程 不能執行,處於無效狀態。
無效狀態有兩種可能,一種是你的存儲過程編輯沒有成功,創建了,但裡面有語法錯誤。
還有一種是存儲過程使用的表有結構上的改變,需要重新編譯一下。
你重新編譯一下,如果不成功,就是有語法問題,你需要修改存儲過程。
B. pl/sql調用存儲過程不成功,求解決(oracle 10)
你的存儲過程就有問題吧。我的資料庫也是Oracle 10的,創建過程時報錯,select中沒有into子語。過程改好的話,調用是可以的。第一種的時候加括弧 CALL procere_test()
C. 如何在sqlserver 的函數或存儲過程中拋出異常
其語法如下:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ]
)
[ WITH option [ ,...n ] ]
簡要說明一下:
第一個參數:{ msg_id | msg_str | @local_variable }
msg_id:表示可以是一個sys.messages表中定義的消息代號;
使用 sp_addmessage 存儲在 sys.messages 目錄視圖中的用戶定義錯誤消息號。
用戶定義錯誤消息的錯誤號應當大於 50000。
msg_str:表示也可以是一個用戶定義消息,該錯誤消息最長可以有 2047 個字元;
(如果是常量,請使用N'xxxx',因為是nvarchar的)
當指定 msg_str 時,RAISERROR 將引發一個錯誤號為 5000 的錯誤消息。
@local_variable:表示也可以是按照 msg_str 方式的格式化字元串變數。
第二個參數:severity
用戶定義的與該消息關聯的嚴重級別。(這個很重要)
任何用戶都可以指定 0 到 18 之間的嚴重級別。
[0,10]的閉區間內,不會跳到catch;
如果是[11,19],則跳到catch;
如果[20,無窮),則直接終止資料庫連接;
第三個參數:state
如果在多個位置引發相同的用戶定義錯誤,
則針對每個位置使用唯一的狀態號有助於找到引發錯誤的代碼段。
介於 1 至 127 之間的任意整數。(state 默認值為1)
當state 值為 0 或大於 127 時會生成錯誤!
第四個參數:argument
用於代替 msg_str 或對應於 msg_id 的消息中的定義的變數的參數。
第五個參數:option
錯誤的自定義選項,可以是下表中的任一值:
LOG :在錯誤日誌和應用程序日誌中記錄錯誤;
NOWAIT:將消息立即發送給客戶端;
SETERROR:將 @@ERROR 值和 ERROR_NUMBER 值設置為 msg_id 或 50000;
[SQL]代碼示例
--示例1DECLARE @raiseErrorCode nvarchar(50)
SET @raiseErrorCode = CONVERT(nvarchar(50), YOUR UNIQUEIDENTIFIER KEY)
RAISERROR('%s INVALID ID. There is no record in table',16,1, @raiseErrorCode)
--示例2RAISERROR (
N'This is message %s %d.', -- Message text,
10, -- Severity,
1, -- State,
N'number', -- First argument.
5 -- Second argument.
);
-- The message text returned is: This is message number 5.
GO
--示例3RAISERROR (N'<<%*.*s>>', -- Message text.
10, -- Severity,
1, -- State,
7, -- First argument used for width.
3, -- Second argument used for precision.
N'abcde'); -- Third argument supplies the string.
-- The message text returned is: << abc>>.
GO
--示例4RAISERROR (N'<<%7.3s>>', -- Message text.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO
--示例5
--A. 從 CATCH 塊返回錯誤消息
以下代碼示例顯示如何在 TRY 塊中使用 RAISERROR 使執行跳至關聯的 CATCH 塊中。
它還顯示如何使用 RAISERROR 返回有關調用 CATCH 塊的錯誤的信息。
BEGIN TRY
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;
--示例6
--B. 在 sys.messages 中創建即席消息
以下示例顯示如何引發 sys.messages 目錄視圖中存儲的消息。
該消息通過 sp_addmessage 系統存儲過程,以消息號50005添加到 sys.messages 目錄視圖中。
sp_addmessage @msgnum = 50005,
@severity = 10,
@msgtext = N'<<%7.3s>>';
GO
RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO
sp_dropmessage @msgnum = 50005;
GO
--示例7
--C. 使用局部變數提供消息文本
以下代碼示例顯示如何使用局部變數為 RAISERROR 語句提供消息文本。sp_addmessage @msgnum = 50005,
@severity = 10,
@msgtext = N'<<%7.3s>>';
GO
RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO
sp_dropmessage @msgnum = 50005;
GO
轉自博客園: www.cnblogs.com/weixing/p/3930162.html
D. oracle存儲過程基本語法
一:存儲過程
創建存儲過程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統許可權
刪除存儲過程,是過程的創建者或者擁有DROP ANY PROCEDURE系統許可權
修改存儲過程,則只能是過程的創建者或者擁有ALTER ANY PROCEDURE系統許可權的人
執行(或調用)存儲過程,是過程的創建者或是擁有EXECUTE ANY PROCEDURE系統許可權的人或是被擁有者授予EXECUTE許可權的人
1:語法
1)創建
CREATE[ORREPLACE]PROCEDURE存儲過程名[(參數[IN|OUT|INOUT] 數據類型...)]
{AS|IS}
[說明部分]
BEGIN
可執行部分
[EXCEPTION
錯誤處理部分]
END[過程名];
說明:
OR REPLACE 表示如果存在就覆蓋存儲過程
參數有三種形式:IN、OUT和IN OUT。則默認為IN。
關鍵字AS也可以寫成IS,後跟過程的說明部分,可以在此定義過程的局部變數。
2)刪除存儲過程:
DROP PROCEDURE 存儲過程名;
3)修改存儲過程:
ALTER PROCEDURE 存儲過程名 COMPILE;
4)執行存儲過程
EXECUTE 模式名.存儲過程名[(參數...)];
或
BEGIN
模式名.存儲過程名[(參數...)];
END;
另外:參數可以是變數、常量或表達式
要其它用戶執行存儲過程須要給其它用戶授權
GRANT EXECUTE ON 存儲過程名 TO 用戶名
2:參數說明
IN 定義一個輸入參數變數,用於傳遞參數給存儲過程
OUT 定義一個輸出參數變數,用於從存儲過程獲取數據
IN OUT 定義一個輸入、輸出參數變數,兼有以上兩者的功能
1)參數名 IN 數據類型 DEFAULT 值;
定義一個輸入參數變數,用於傳遞參數給存儲過程。
可以是常量、有值變數或表達式
DEFAULT 關鍵字為可選項,用來設定參數的默認值。如果在調用存儲過程時不指明參數,則參數變數取默認值
在存儲過程中,輸入變數接收主程序傳遞的值,但不能對其進行賦值。
2)參數名 OUT 數據類型;
定義一個輸出參數變數,用於從存儲過程獲取數據,即變數從存儲過程中返回值給主程序。
在調用存儲過程時,主程序的實際參數只能是一個變數,而不能是常量或表達式。
在存儲過程中,參數變數只能被賦值而不能將其用於賦值,而且必須給輸出變數至少賦值一次。
3)參數名 IN OUT 數據類型 DEFAULT 值;
定義一個輸入、輸出參數變數,兼有以上兩者的功能。
在調用存儲過程時,主程序的實際參數只能是一個變數,而不能是常量或表達式。
DEFAULT 關鍵字為可選項,用來設定參數的默認值。
在存儲過程中,變數接收主程序傳遞的值,同時可以參加賦值運算,也可以對其進行賦值。在存儲過程中必須給變數至少賦值一次。
補充:如果省略IN、OUT或IN OUT,則默認模式是IN。
調用它時參數個數與位置可以不一致,用以下形式調用:
EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788); //=>運算符左側是參數名,右側是參數表達式
二:函數
創建函數,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統許可權
刪除函數,需要是函數的創建者或者是擁有DROP ANY PROCEDURE系統許可權的人
修改函數,需要是函數的創建者或者擁有ALTER ANY PROCEDURE系統許可權的人
執行函數,需要是函數的創建者或擁有EXECUTE ANY PROCEDURE系統許可權的人
1:語法
1)創建:
CREATE[ORREPLACE]FUNCTION函數名[(參數[IN] 數據類型...)]
RETURN數據類型
{AS|IS}
[說明部分]
BEGIN
可執行部分
RETURN(表達式)
[EXCEPTION
錯誤處理部分]
END[函數名];
說明:
參數是可選的,但只能是IN類型(IN關鍵字可以省略)。
在定義部分的RETURN 數據類型,用來表示函數的數據類型,也就是返回值的類型,不可省略。
在可執行部分的RETURN(表達式),用來生成函數的返回值,其表達式的類型應該和定義部分說明的函數返回值的數據類型一致。在函數的執行部分可以有多個RETURN語句,但只有一個RETURN語句會被執行,一旦執行了RETURN語句,則函數結束並返回調用環境。
2)刪除
DROP FUNCTION 函數名;
3)修改
ALTER PROCEDURE 函數名 COMPILE;
4)執行
變數名:=函數名(...)
三:對存儲過程 和 函數的查看(可以通過對數據字典【USER_SOURCE】的訪問來查詢存儲過程或函數的有關信息)
1:查詢某個存儲過程序內容
select TEXT from user_source WHERE NAME='存儲過程名';
2:查看數據字殿
DESCRIBE USER_SOURCE ; //命令行中
3:查看存儲過程的參數
DESCRIBE say_hello; //後面是過程名
4:查看發生編輯錯誤
SHOW ERRORS ;
5:查詢一個存儲過程或函數是否是有效狀態(即編譯成功)
SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='過程名';//注意大小寫
VALID表示該存儲過程有效(即通過編譯),INVALID表示存儲過程無效或需要重新編譯。它的狀態會改變,這與它依賴外部表(表刪除修改等操作)有關系
6:查看存儲過程與表的依賴關系
SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';
說明
NAME為實體名,TYPE為實體類型,REFERENCED_OWNER為涉及到的實體擁有者賬戶,REFERENCED_NAME為涉及到的實體名,REFERENCED_TYPE 為涉及到的實體類型。
問題:
如果一個用戶A被授予執行屬於用戶B的一個存儲過程的許可權,在用戶B的存儲過程中,訪問到用戶C的表,用戶B被授予訪問用戶C的表的許可權,但用戶A沒有被授予訪問用戶C表的許可權,那麼用戶A調用用戶B的存儲過程是失敗的還是成功的呢?答案是成功的。
E. oracle存儲過程 處於無效狀態
1、你的存儲過程有錯誤,編譯不通過。處理於無效狀態。
2、問題
存儲過程中隱式游標的select語句必須要有into子句。
而select*fromtemp_syckzl_zy這是一個沒有意義的語句;
應改為如:selectcol1intov_col1fromtemp_syckzl_zy;
註:col1為表中一欄位,v_col1為一變數
F. oracle 存儲過程怎麼老是這個錯誤。PLS-00905: 對象 SYS.PROC6 無效;;PL/SQL: Statement ignored
SQL>
2testvalue1VARCHAR2(20);
3testvalue2VARCHAR2(20);
4BEGIN
5dbms_output.put_line('HelloWorld');
6testvalue1:='FirstTest!';
搏數唯7SELECT'SecondTest!'INTOtestvalue2FROMDUAL;
8基培dbms_output.put_line(testvalue1||testvalue2);
9畢鋒ENDHelloWorld;
10/
過程已創建。
SQL>setserveroutputon
SQL>
SQL>BEGIN
2HelloWorld();
3END;
4/
HelloWorld
FirstTest!SecondTest!
PL/SQL過程已成功完成。
不知道是不是你那裡沒有 括弧的原因...
G. 我用plsql創建的存儲過程為什麼是無效的
你在編寫完存儲過程後,有沒有打「\」這是代表預編譯這個存儲過程,然後你在打
exec test試試
H. delphi clientdataset 執行存儲過程 提示Invalid data packet.
procere TForm1.FormCreate(Sender: TObject);
begin
SysPath:= ExtractFilePath(ParamStr(0));
end;
procere TForm1.Button1Click(Sender: TObject);
var
sDataPath: string;
begin
sDataPath := SysPath + 'Data\country.xml';
DBGrid1.DataSource := DataSource1;
DataSource1.DataSet := ClientDataSet1;
ClientDataSet1.FileName := sDataPath;
ClientDataSet1.Active := True; //或 ClientDataSet1.Open;
end;
I. 用什麼命令可以重新編譯所有的存儲過程
這是我同事做的一個存儲過程,我們一般都用這個處理
CREATE OR REPLACE PROCEDURE OWN.P_HSJ_COMPRE
IS
CURSOR cur_invalid_obj IS
SELECT uo.object_name,uo.object_type
FROM user_objects uo,
USER_ORDER_OBJECT_BY_DEPEND uobd
WHERE uo.object_id = uobd.object_id(+) AND uo.status != 'VALID'
ORDER BY uobd.dlevel desc,uo.object_type,uo.object_name;
ls_objname VARCHAR2(100);
ls_objtype VARCHAR2(100);
ls_status VARCHAR2(20);
ls_text VARCHAR2(4000);
ls_sql varchar2(100);
BEGIN
OPEN cur_invalid_obj;
LOOP
FETCH cur_invalid_obj INTO ls_objname,ls_objtype;
EXIT WHEN cur_invalid_obj%NOTFOUND;
IF ls_objtype IN ('PACKAGE BODY', 'PACKAGE', 'FUNCTION', 'PROCEDURE','TRIGGER', 'VIEW') THEN
if ls_objtype ='VIEW' then
ls_sql :=' ALTER VIEW '||LS_OBJNAME ||' COMPILE';
execute immediate ls_sql;
else
DBMS_DDL.alter_compile(ls_objtype,NULL,ls_objname);
end if;
SELECT status INTO ls_status FROM user_objects
WHERE object_name = ls_objname AND object_type = ls_objtype;
/* IF ls_status != 'VALID' THEN
SELECT text INTO ls_text FROM user_errors
WHERE name = ls_objname AND type = ls_objtype;
END IF;
*/
END IF;
END LOOP;
CLOSE cur_invalid_obj;
EXCEPTION
WHEN OTHERS THEN
IF cur_invalid_obj%ISOPEN THEN
CLOSE cur_invalid_obj;
END IF;
END;
/