1. 程式人生 > >資料庫系統概論05-動態SQL&儲存過程&函式

資料庫系統概論05-動態SQL&儲存過程&函式

動態SQL

使用SQL語句主變數

EXEC SQL BEGIN DECLARE SECTION;
    const char *stmt="CREATE TABLE test(a int);"/*SQL語句主變數,內容是建立表的SQL語句*/
EXEC SQL END DECLARE SECTION;

EXEC SQL EXECUTE IMMEDIATE:stmt;/*執行準備好的語句,執行動態SQL語句*/

/*宣告主變數*/
EXEC SQL PREPARE 語句名 FROM <SQL語句主變數>/*準備SQL語句*/
EXEC SQL EXECUTE 語句名 INTO 主變量表 USING <主變數或常量>/*執行動態SQL語句*/

動態引數:引數符號(?)表示在執行時設定該位置資料。PREPARE語句準備主變數和執行語句EXECUTE繫結資料。

儲存過程

建立

CREATE OR REPLACE PROCEDURE 過程名(引數1,引數2) /*儲存過程首部*/

AS <過程化SQL塊>/*儲存過程體,描述該儲存過程的操作*/
CREATE OR REPLACE PROCEDURE REANSFER(inACCOUNT INT,outACCOUNT INT,amount FLOAT) /*儲存過程首部*/

AS DECLARE/*定義變數,儲存過程體,描述該儲存過程的操作*/
    totalDepositOut Float;
    totalDepositIn Float;
    inAccountnum INT;
    BEGIN
    ...


--帶參儲存過程
if (object_id('proc_find_stu', 'P') is not null)
    drop proc proc_find_stu
go
create proc proc_find_stu(@startId int, @endId int)
as
    select * from student where id between @startId and @endId
go

exec proc_find_stu 2, 4;


--建立儲存過程(不帶引數)
if (exists (select * from sys.objects where name = 'proc_get_student'))
    drop proc proc_get_student
go
create proc proc_get_student
as
    select * from student;

--呼叫、執行儲存過程
exec proc_get_student;

修改儲存過程

ALTER PROCEDURE 過程名1 RENAME TO 過程名2;
ALTER PROCEDURE 過程名 COMPILE;

--修改儲存過程
alter proc proc_get_student
as
select * from student;

刪除儲存過程

DROP PROCEDURE 過程名();  

函式

建立

CREATE OR REPLACE FUNCTION 函式名(引數1,引數2) 

RETURNS <型別> AS <過程化SQL塊>

執行

CALL/SELECT 函式名(引數1,引數2...)

修改

ALTER FUNCTION 過程名1 RENAME TO 過程名2;