A. 存儲過程的問題
CREATE PROCEDURE dbo.EA_List
@ClassID int,
@NClassID int,
@Page int,
@PageSize int,
@TableArticle varchar(20)
AS
Begin
Declare @CmdTxt varchar(1024)
--生成命令
if (@Page <= 1)
Set @CmdTxt=
'
Select Top ' + Cast(@PageSize as varchar(10)) +' ID,Title,Author,AddDate,Hits,Remark,TitleColor
From ' +@TableArticle +'
Where ClassID='+ Cast(@ClassID as varchar(10))+' AND NClassID=' + Cast(@NClassID as varchar(10))+'
ORDER BY ID DESC
'
ELSE
Set @CmdTxt=
'
Select Top '+ Cast(@PageSize as varchar(10)) +' ID,Title,Author,AddDate,Hits,Remark,TitleColor
From ' +@TableArticle +'
Where ClassID='+ Cast(@ClassID as varchar(10))+' AND NClassID=' + Cast(@NClassID as varchar(10))+' AND ID Not In
(
Select Top '+Cast(@PageSize * ( @Page - 1 ) as varchar(10)) +' ID
From ' +@TableArticle +'
Where ClassID='+ Cast(@ClassID as varchar(10))+' AND NClassID=' + Cast(@NClassID as varchar(10))+'
ORDER BY ID DESC
)
ORDER BY ID DESC
'
--執行
Exec @CmdTxt
End
GO
/*
寫代碼要有一定的層次結構,
要不然讓人很難讀[特別是長的時候].
該代碼我在sql SERVER 2000 下測試通過.
*/
B. 存儲過程怎麼寫啊
//創建存儲過程
CREATE PROCEDURE userData(
IN id INT
)
BEGIN
SELECT * from userdata WHERE userflag = id;
END;
其中IN是傳進去的變數;
drop procere userData;//銷毀這個存儲過程。
call userData(2) //調用存儲過程。
(2)存儲過程中單據通過後也有消息擴展閱讀:
sql中的存儲過程及相關介紹:
CREATE PROCEDURE [擁有者.]存儲過程名[;程序編號]
[(參數#1,…參數#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行
其中存儲過程名不能超過128個字。每個存儲過程中最多設定1024個參數
(SQL Server 7.0以上版本),參數的使用方法如下:
@參數名數據類型[VARYING] [=內定值] [OUTPUT]。
每個參數名前要有一個「@」符號,每一個存儲過程的參數僅為該程序內部使用,參數的類型除了IMAGE外,其他SQL Server所支持的數據類型都可使用。
[內定值]相當於我們在建立資料庫時設定一個欄位的默認值,這里是為這個參數設定默認值。[OUTPUT]是用來指定該參數是既有輸入又有輸出值的,也就是在調用了這個存儲過程時,如果所指定的參數值是我們需要輸入的參數。
同時也需要在結果中輸出的,則該項必須為OUTPUT,而如果只是做輸出參數用,可以用CURSOR,同時在使用該參數時,必須指定VARYING和OUTPUT這兩個語句。
參考資料來源:網路-儲存過程
C. 如何在存儲過程中添加語句進行單據控制
存儲過程的結果無法直接與select 做union,一個辦法是建一張臨時表,或者使用表變數,通過insert into exec將存儲過程的內容暫存起來,最後做union,大概語句像這樣: declare @table table(...);insert into @tableexec zjsj '10901';select * ...
D. 存儲過程中的 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
E. 用sql編寫存儲過程,點擊分析出現3個「消息 102,級別 15,狀態 1,第 1 行 'go' 附近有語法錯誤。」
我現在也遇到這種問題了
ALTER VIEW [dbo].[OV收文歸檔1]
AS
SELECT 公文ID, 標題, 收文機關, 發文機關, 主題詞, 收發類別, 摘要, 緩急, 公文類型, 密級, 處理期限, 份數, 公文FID, 歸檔位置, 公文編號, 備注, 收文時間, 文件作者, 發文時間,
處理意見, 成果狀態, 擬稿單位, 擬稿人, 辦理結果, 核稿, 稿簽FID, 主送單位, 抄送單位1, 抄送單位2, 抄送單位3, 抄送單位4, 公文內類型, 校對, 完成登記, 簽發單FID,
抄送單位, 相關文號, 簽發人, 收文編號, 發文編號
FROM dbo.OT公文
WHERE (收發類別 = 0)
GO
消息 102,級別 15,狀態 1,過程 OV收文歸檔1,第 1 行
'GO' 附近有語法錯誤。
F. SQL server新建查詢 存儲過程執行後為什麼總是命令已經完成,執行的結果在那裡可以看到
首先要確定你的存儲過程是否有輸出參數(output)還要看執行存儲過程的時候是否正確最後,確定一切都沒有問題的時候,那可能就是你的輸出結果不是表格是文本,那你就可以修改結果的顯示方式了~
G. .NET執行存儲過程如何得到消息框中的結果
你的資料庫登錄用戶不是SA吧,如果是別從分配的許可權那麼你就沒有修改的許可權,你用SA登錄或者
在資料庫安全性-登錄名中找到你的用戶名-右鍵=屬性-用戶映射-找到你要修改的哪個資料庫
然後按圖把許可權打上勾就行了,這里的設置需要SA來設置
H. sql中如何通過存儲過程返回結果集
引用
4
樓
oraclefans_
的回復:想麻煩了。。你直接返回遊標就是一個結果集合。。CREATE
OR
REPLACE
PROCEDURE
USP_RETN_VAL(
RETN_VAL_CUR
OUT
sys_refcursor)ISBEGIN
OPEN
RETN_VAL_CUR
FOR
SELECT
*
FROM
TBL1;END;調用declare
cur
sys_refcurso……謝謝
但是我是想執行一個存儲過程後,直接返回表裡所有數據,不要再去操作游標。
I. 請教sql存儲過程問題。
你在存儲過程中調用了本身這個存儲過程(這就是嵌套調用),而且未加任何條件限制, 類似於一直調用此存儲過程,造成死循環調用。而資料庫為了避免這樣的調用,只允許嵌套執行32次,超出就發生異常。
所以,請不要進行這樣的嵌套調用(就是不要在存儲過程中調用自己),或者添加調用條件。