當前位置:首頁 » 編程語言 » sql存儲過程動態語句
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql存儲過程動態語句

發布時間: 2022-06-22 09:22:07

A. oracle存儲過程中如何執行動態sql語句

有時需要在oracle
存儲過程
中執行動態SQL
語句
,例如表名是動態的,或欄位是動態的,或查詢命令是動態的,可用下面的方法:
set
serveroutput
on
declare
n
number;
sql_stmt
varchar2(50);
t
varchar2(20);
begin
execute
immediate
'alter
session
set
nls_date_format=''YYYYMMDD''';
t
:=
't_'
||
sysdate;
sql_stmt
:=
'select
count(*)
from
'
||
t;
execute
immediate
sql_stmt
into
n;
dbms_output.put_line('The
number
of
rows
of
'
||
t
||
'
is
'
||
n);
end;
如果動態SQL
語句
很長很復雜,則可用包裝.
CREATE
OR
REPLACE
PACKAGE
test_pkg
IS
TYPE
cur_typ
IS
REF
CURSOR;
PROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ);
END;
/
CREATE
OR
REPLACE
PACKAGE
BODY
test_pkg
IS
PROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ)
IS
sqlstr
VARCHAR2(2000);
BEGIN
sqlstr
:=
'SELECT
*
FROM
'||v_table;
OPEN
t_cur
FOR
sqlstr;
END;
END;
/
在oracle
中批量導入,導出和刪除表名以某些字元開頭的表
spool
c:\a.sql
select
'drop
table
'
||
tname
||
';'
from
tab
where
tname
like
'T%';
spool
off
@c:\a

B. 如何在oracle存儲過程中執行動態sql語句

時需要在oracle 存儲過程中執行動態SQL 語句 ,例如表名是動態的,或欄位是動態的,
或查詢命令是動態的,可用下面的方法:
set serveroutput ondeclaren number;sql_stmt varchar2(50);
t varchar2(20);beginexecute immediate 'alter session set nls_date_format=''YYYYMMDD''';
t := 't_' || sysdate;
sql_stmt := 'select count(*) from ' || t;
execute immediate sql_stmt into n;
dbms_output.put_line('The number of rows of ' || t || ' is ' || n);end;
如果動態SQL 語句 很長很復雜,則可用包裝.
CREATE OR REPLACE PACKAGE test_pkgISTYPE cur_typ IS REF CURSOR;
PROCEDURE test_proc (v_table VARCHAR2,t_cur OUT cur_typ);END;/
CREATE OR REPLACE PACKAGE BODY test_pkgISPROCEDURE test_proc (v_table VARCHAR2,t_cur OUT cur_typ)ISsqlstr VARCHAR2(2000);BEGINsqlstr := 'SELECT * FROM '||v_table;
OPEN t_cur FOR sqlstr;END;END;/
在oracle 中批量導入,導出和刪除表名以某些字元開頭的表
spool c:\a.sql

C. 動態SQL語句與存儲過程,誰有高見謝謝

如果你不寫存儲過程你有沒想過會效率根低呢!
說白了你就是不明白存儲過程!
在一個名稱下存儲並作為一個單元進行編譯和處理的T-SQL 語句的集合。

在一個存儲過程內,可以設計、編碼、測試和執行某個常用任務所需的 SQL 語句和邏輯。之後,每個需要執行該任務的應用程序只須執行此存儲過程即可。
允許模塊化程序設計
對於需要重復執行的代碼,執行效率更高
減少網路流量
可作為安全機制使用
好了如果你不用!那好我問你SQL注入你要怎麼防止!
而且插入數據如果出現問題!數據會保存么!
這樣你就會有那樣這樣的BAG出現!
存儲過程為什麼叫存儲過程呢!
就是因為它預先把T-SQL語句存起來!在執行的時候系統會省掉很多緩存資源!
而且不會浪費資源!
假如有幾百條的存儲過程要寫!又要計算!
那麼為什麼不可以在客戶端實現一些這樣又可以減輕SQL的負擔!
現在的電腦配置能很高啦!問題一般出現不大!
界面驗證呀!像一些簡單的查詢大可以在客戶端實現么!
敏感數據在用存儲過程計算!
我就做你說的那種第二種的開發!
效果也挺不錯!
問題不在於存儲過程!在於你代碼的如何編寫!
怎麼樣能夠大大提高運行的效率!
例如不必要浪費的常量!開辟會占堆中資源!
有的代碼運行次數太少!可以簡寫!甚至不寫!非必要都可以省略!
4層架構知道吧!盡量的做到代碼要重用!可大大減少資源的浪費!
SQL的負擔也會騰出來許多!
扯遠啦!
好了就這吧!
希望對你有幫助!

D. sql 存儲過程語句編寫

要到達你的要求,在存儲過程中必須使用動態SQL語句。


一個簡化的例子:

createprocereMyDynamicSQL
@tblwherenvarchar(200)--a==aora==xxx
as
begin
declare@sqlnvarchar(max)
--動態拼接sql語句
set@sql=N'select*from[表一]where'+@tblwhere
--執行
executesp_executesql@sql
end

E. Sql存儲過程 如何動態修改sql語句!

利用動態sql:
將整個sql語句編輯成一個字元串,最終通過execute語句來執行動態sql

Select @Count = count(ID)
FROM NetDIY_Procts_CN
那麼這個呢?需要把結果返回到@Count中,要怎麼在這個sql加上@SqlWhere 條件語句

exec('select ' + @Count + '= count(ID) from NetDIY_Procts_CN ' + @SqlWhere)

SELECT * FROM NetDIY_Procts_CN Where weighting <= @Name order By weighting desc
exec('select * FROM NetDIY_Procts_CN Where weighting <= '+@Name+' ' + @SqlWhere+' order By weighting desc')
兩種都出錯

F. MySQL存儲過程中實現執行動態SQL語句的方法

本文實例講述了MySQL存儲過程中實現執行動態SQL語句的方法。分享給大家供大家參考。具體實現方法如下:
mysql>
mysql>
delimiter
$$
mysql>
mysql>
CREATE
PROCEDURE
set_col_value
->
(in_table
VARCHAR(128),
->
in_column
VARCHAR(128),
->
in_new_value
VARCHAR(1000),
->
in_where
VARCHAR(4000))
->
->
BEGIN
->
DECLARE
l_sql
VARCHAR(4000);
->
SET
l_sql=CONCAT_ws('
',
->
'UPDATE',in_table,
->
'SET',in_column,'=',in_new_value,
->
'
WHERE',in_where);
->
SET
@sql=l_sql;
->
PREPARE
s1
FROM
@sql;
->
EXECUTE
s1;
->
DEALLOCATE
PREPARE
s1;
->
END$$
Query
OK,
0
rows
affected
(0.00
sec)
希望本文所述對大家的MySQL資料庫程序設計有所幫助。

G. 存儲過程含有動態SQL,與靜態SQL有什麼差別

SQL 語句從編譯和運行的角度可以分為兩種,靜態 SQL和 動態 SQL,這兩種 SQL 在使用方式、運行機制和性能表現等方面各有特點 :

靜態 SQL:靜態 SQL 語句一般用於嵌入式 SQL 應用中,在程序運行前,SQL 語句必須是確定的,例如 SQL 語句中涉及的列名和表名必須是存在的。靜態 SQL 語句的編譯是在應用程序運行前進行的,編譯的結果會存儲在資料庫內部。而後程序運行時,資料庫將直接執行編譯好的 SQL 語句,降低運行時的開銷。

動態 SQL:動態 SQL 語句是在應用程序運行時被編譯和執行的,例如,使用 DB2 的互動式工具 CLP 訪問資料庫時,用戶輸入的 SQL 語句是不確定的,因此 SQL 語句只能被動態地編譯。動態 SQL 的應用較多,常見的 CLI 和 JDBC 應用程序都使用動態 SQL。

靜態sql:語句類型在編程時候必須是確定好的。比如
select * from employee where empno='abc'select * from employee where empno='12'都必須是確定的,唯一可以變化的是abc的值。
動態sql:語句類型可以在運行期間指定,比如clp就是最典型的動態sql程序,你可以輸入任何命令。
靜態sql的存取路徑是在運行前就確定好的,而動態sql的存取路徑是在運行時動態生成的。因此生成的存取計劃相對更優,但考慮到生成存取路徑的開銷,有可能應用程序的運行時間相對會比靜態sql長些。

H. 寫MS-SQL存儲過程動態語句的時候

寫MS-SQL存儲過程動態語句的時候
有時需要在oracle 存儲過程中執行動態SQL 語句 ,例如表名是動態的,或欄位是動態的,
或查詢命令是動態的,可用下面的方法:
set serveroutput ondeclaren number;sql_stmt varchar2(50);
t varchar2(20);beginexecute immediate 'alter session set nls_date_format=''YYYYMMDD''';
t := 't_' || sysdate;
sql_stmt := 'select count(*) from ' || t;
execute immediate sql_stmt into n;

I. oracle存儲過程中如何執行動態SQL語句 詳細

有時需要在oracle
存儲過程中執行動態SQL
語句
,例如表名是動態的,或欄位是動態的,
或查詢命令是動態的,可用下面的方法:
set
serveroutput
ondeclaren
number;sql_stmt
varchar2(50);
t
varchar2(20);beginexecute
immediate
'alter
session
set
nls_date_format=''YYYYMMDD''';
t
:=
't_'
||
sysdate;
sql_stmt
:=
'select
count(*)
from
'
||
t;
execute
immediate
sql_stmt
into
n;
dbms_output.put_line('The
number
of
rows
of
'
||
t
||
'
is
'
||
n);end;
如果動態SQL
語句
很長很復雜,則可用包裝.
CREATE
OR
REPLACE
PACKAGE
test_pkgISTYPE
cur_typ
IS
REF
CURSOR;
PROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ);END;/
CREATE
OR
REPLACE
PACKAGE
BODY
test_pkgISPROCEDURE
test_proc
(v_table
VARCHAR2,t_cur
OUT
cur_typ)ISsqlstr
VARCHAR2(2000);BEGINsqlstr
:=
'SELECT
*
FROM
'||v_table;
OPEN
t_cur
FOR
sqlstr;END;END;/
在oracle
中批量導入,導出和刪除表名以某些字元開頭的表
spool
c:\a.sql

J. 怎樣SQL存儲過程中執行動態SQL語句

1.EXEC的使用
EXEC命令有兩種用法,一種是執行一個
存儲過程
,另一種是執行一個動態的
批處理
。以下所講的都是第二種用法。
下面先使用EXEC演示一個例子,代碼1
DECLARE
@TableName
VARCHAR(50),@Sql
NVARCHAR
(MAX),@OrderID
INT;
SET
@TableName
=
'Orders';
SET
@OrderID
=
10251;
SET
@sql
=
'SELECT
*
FROM
'+QUOTENAME(@TableName)
+'WHERE
OrderID
=
'+
CAST(@OrderID
AS
VARCHAR(10))+'
ORDER
BY
ORDERID
DESC'
EXEC(@sql);
sp_executesql命令在SQL
Server中引入的比EXEC命令晚一些,它主要為重用執行計劃提供更好的支持。
為了和EXEC作一個鮮明的對比,我們看看如果用代碼1的代碼,把EXEC換成sp_executesql,看看是否得到我們所期望的結果
DECLARE
@TableName
VARCHAR(50),@sql
NVARCHAR(MAX),@OrderID
INT
,@sql2
NVARCHAR(MAX);
SET
@TableName
=
'Orders
';
SET
@OrderID
=
10251;
SET
@sql
=
'SELECT
*
FROM
'+QUOTENAME(@TableName)
+
'
WHERE
OrderID
=
'+CAST(@OrderID
AS
VARCHAR(50))
+
'
ORDER
BY
ORDERID
DESC'
EXEC
sp_executesql
@sql