有時需要在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
『貳』 Oracle寫出相應的SQL語句 1. 系統管理員admin,密碼為adminpwd,登錄後創建用戶abc,密碼ab
系統管理員admin,密碼為adminpwd,登錄後創建用戶abc,密碼abcpwd,並創建data表空間作為該用戶的默認表空間,數據文件存儲在D盤project目錄。
create tablespace data datafile 'D/project'
create user abc identified by abcpwd default tablesapce data
『叄』 在oracle中 PL/sql程序塊必須包括哪幾部分
PL/SQL塊的結構如下:
DECLARE
/* 聲明部分: 在此聲明PL/SQL用到的變數,類型及游標,以及局部的存儲過程和函數 */
BEGIN
/* 執行部分: 過程及SQL 語句 , 即程序的主要部分 */
EXCEPTION
/* 執行異常部分: 錯誤處理 */
END;
其中 執行部分是必須的
『肆』 oracle 通過sql語句備份資料庫
oracle沒有sql語句備份,只有exp導出或者RMAN備份,都不是sql,RMAN是標準的數據塊備份,前提要求是資料庫一定要開啟歸檔,然後才可以進行RMAN備份,這個方法對數據量大的資料庫可以使用,速度會比較快,具體方法可以從網上查,不是很難,但比較繁瑣,還有一個exp導出,這個是直接將資料庫內的表直接導出城dmp文件,具體的語法是
exp user/password@DBSID file=D:\備份目標文件夾\文件名.dmp log=D:\備份目標文件夾\文件名.log owner=用戶名
上述語句是需要在cmd命令行下執行的,如果想導出哪個用戶就可以導出哪個用戶,只要能用sql語句連接到資料庫就可以使用,不管在哪個機器
『伍』 Oracle游標sql語句代碼塊的優化
游標操作的優化:
-- 有一個表格,存儲的是用戶的名字,將 emp 表中所有的用戶名轉換成小寫,再寫入這個表格
create table ename_emp(
ename varchar2(50)
);
-- 下面這個游標的操作,需要 43s時間才能完成
declare
begin
for i in (select ename from emp_liebiao) loop
insert into ename_emp values(lower(i.ename));
commit;
end loop;
end;
-- 因為游標是以行為單位進行數據的操作的,所有游標的效率是比較慢的,而且游標需要消耗的內存也是比較多的,我們需要將游標以行進行操作的方式,修改成一次性操作所有數據的批量的方式。
批量操作在游標裡面 叫做 bulk collect
第一步,創建一個表類型
type 表類型的名字 is table of 表名.列名 %type;
變數名 表類型的名字;
第三步,創建一個游標,讀取某個查詢的結果
cursor 游標名字 is select 查詢語句 ;
第四步,打開游標
open 游標名字;
第五步,捕獲游標的數據,將內容給到表類型的變數進行保存
fetch 游標名字 bulk collect into 變數名字 ;
第六步,使用 forall 語句,對數據進行批量的操作
forall i in 變數 .first .. 變數 .last DML 語句操作 ;
第七步,關閉游標
close 游標名字 ;
declare
-- 創建表類型
type biao is table of emp_liebiao.ename%type;
b biao;
-- 創建游標
cursor m is select ename from emp_liebiao;
begin
-- 打開游標
open m;
-- 將游標的內容批量的給到變數
fetch m bulk collect into b;
-- 使用forall批量修改數據
forall i in b.first .. b.last insert into ename_emp values(lower(b(i)));
commit;
-- 關閉游標
close m;
end;
練習:批量修改用戶的編號,讓編號+工資等級+部門,形成一個新的編號,存入下面的表格中,使用 bulk collect 來實現。
2000以下是 C ,2000-3000是 B ,3000以上是 A ,
例如 SMITH , 新編號應該是 7369_C_20
create table empno_emp(
empno varchar2(50)
);
declare
type biao is table of emp_liebiao%rowtype;
b biao;
cursor m is select * from emp_liebiao;
begin
open m;
fetch m bulk collect into b;
forall i in b.first..b.last
insert into empno_emp values(
b(i).empno||'_'||decode(sign(b(i).sal-2000)+sign(b(i).sal-3000),-2,'C',2,'A','B')||'_'||b(i).deptno
);
commit;
close m;
end;
『陸』 oracle SQL語句,日期格式轉換
TO_DATE格式(以時間:2007-11-02 13:45:25為例)
1、日期和字元轉換函數用法(to_date,to_char)
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from al; //日期轉化為字元串
select to_char(sysdate,'yyyy') as nowYear from al; //獲取時間的年
select to_char(sysdate,'mm') as nowMonth from al; //獲取時間的月
select to_char(sysdate,'dd') as nowDay from al; //獲取時間的日
select to_char(sysdate,'hh24') as nowHour from al; //獲取時間的時
select to_char(sysdate,'mi') as nowMinute from al; //獲取時間的分
select to_char(sysdate,'ss') as nowSecond from al; //獲取時間的秒
2、字元串和時間互轉
select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from al
select to_char( to_date(222,'J'),'Jsp') from al //顯示Two Hundred Twenty-Two
(6)oraclesql語句塊擴展閱讀
date 轉換為字元串:
to_char(日期,」轉換格式」 ) 即把給定的日期按照「轉換格式」轉換。
轉換的格式:
表示year的:y 表示年的最後一位 yy 表示年的最後2位 yyy 表示年的最後3位 yyyy 用4位數表示年。
表示month的:mm 用2位數字表示月;mon 用簡寫形式 比如11月或者nov ;month 用全稱 比如11月或者november。
表示day的:dd 表示當月第幾天;ddd表示當年第幾天;dy 當周第幾天 簡寫 比如星期五或者fri;day當周第幾天全寫。比如星期五或者friday。
表示hour的:hh 2位數表示小時 12進制; hh24 2位數表示小時 24小時。
表示minute的:mi 2位數表示分鍾。
表示second的:ss 2位數表示秒60進制。
『柒』 oracle 存儲過程執行動態sql實例
oracle的動態sql是指在語句塊使用execute immediate 執行sql語句,sql語句可以使用存儲過程傳的參數進行拼接,本文針對varchar2和number兩種類型的參數類型,進行sql拼接並執行。
功能:輸入日期區間,銷售數量滿足上限和下限的產品id
1.正常傳值
輸出結果
2.若果number類型的參數傳空,會報ora-00936:缺失表達式,可以在存儲過程中增加對參數null值的判斷
oracle 動態拼接傳入參數,varchar2類型可以使用'''|| IN_START_DTIME || ''' ,number類型可以使用'||IN_DOWN_LIMIT||' ; 拼接的過程需要注意校驗參數的合法性,增加存儲過程的容錯性。臨時表使用了會話級,存儲過程執行完,可以通過查詢存儲過程獲取結果。
『捌』 Oracle存儲過程中帶參數的sql語句怎麼寫
有兩種,一種用CALL,一種用語句塊。
比如你的存錯過程是HELP(NUMBER AA)且不帶返回值的
1:CALL HELP(111);
2:DECLARE
BEGIN
HELP(111);
END;
『玖』 oracle SQL語句中怎麼樣調用存儲過程
PL/SQL是ORACLE對標准資料庫語言的擴展,ORACLE公司已經將PL/SQL整合到ORACLE 伺服器和其他工具中了,近幾年中更多的開發人員和DBA開始使用PL/SQL,本文將講述PL/SQL基礎語法,結構和組件、以及如何設計並執行一個PL/SQL程序。
PL/SQL的優點
從版本6開始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的優點以及其獨有的數據管理的便利性,那麼你很難想像ORACLE缺了PL/SQL的情形。PL/SQL 不是一個獨立的產品,他是一個整合到ORACLE伺服器和ORACLE工具中的技術,可以把PL/SQL看作ORACLE伺服器內的一個引擎,sql語句執行者處理單個的sql語句,PL/SQL引擎處理PL/SQL程序塊。當PL/SQL程序塊在PL/SQL引擎處理時,ORACLE伺服器中的SQL語句執行器處理pl/sql程序塊中的SQL語句。
PL/SQL的優點如下:
. PL/SQL是一種高性能的基於事務處理的語言,能運行在任何ORACLE環境中,支持所有數據處理命令。通過使用PL/SQL程序單元處理SQL的數據定義和數據控制元素。
. PL/SQL支持所有SQL數據類型和所有SQL函數,同時支持所有ORACLE對象類型
. PL/SQL塊可以被命名和存儲在ORACLE伺服器中,同時也能被其他的PL/SQL程序或SQL命令調用,任何客戶/伺服器工具都能訪問PL/SQL程序,具有很好的可重用性。
. 可以使用ORACLE數據工具管理存儲在伺服器中的PL/SQL程序的安全性。可以授權或撤銷資料庫其他用戶訪問PL/SQL程序的能力。
. PL/SQL代碼可以使用任何ASCII文本編輯器編寫,所以對任何ORACLE能夠運行的操作系統都是非常便利的
. 對於SQL,ORACLE必須在同一時間處理每一條SQL語句,在網路環境下這就意味作每一個獨立的調用都必須被oracle伺服器處理,這就佔用大量的伺服器時間,同時導致網路擁擠。而PL/SQL是以整個語句塊發給伺服器,這就降低了網路擁擠。
PL/SQL塊結構
PL/SQL是一種塊結構的語言,組成PL/SQL程序的單元是邏輯塊,一個PL/SQL 程序包含了一個或多個邏輯塊,每個塊都可以劃分為三個部分。與其他語言相同,變數在使用之前必須聲明,PL/SQL提供了獨立的專門用於處理異常的部分,下面描述了PL/SQL塊的不同部分:
聲明部分(Declaration section)
聲明部分包含了變數和常量的數據類型和初始值。這個部分是由關鍵字DECLARE開始,如果不需要聲明變數或常量,那麼可以忽略這一部分;需要說明的是游標的聲明也在這一部分。
執行部分(Executable section)
執行部分是PL/SQL塊中的指令部分,由關鍵字BEGIN開始,所有的可執行語句都放在這一部分,其他的PL/SQL塊也可以放在這一部分。
異常處理部分(Exception section)
這一部分是可選的,在這一部分中處理異常或錯誤,對異常處理的詳細討論我們在後面進行。
PL/SQL塊語法
[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END
PL/SQL塊中的每一條語句都必須以分號結束,SQL語句可以使多行的,但分號表示該語句的結束。一行中可以有多條SQL語句,他們之間以分號分隔。每一個PL/SQL塊由BEGIN或DECLARE開始,以END結束。注釋由--標示。
PL/SQL塊的命名和匿名
PL/SQL程序塊可以是一個命名的程序塊也可以是一個匿名程序塊。匿名程序塊可以用在伺服器端也可以用在客戶端。
命名程序塊可以出現在其他PL/SQL程序塊的聲明部分,這方面比較明顯的是子程序,子程序可以在執行部分引用,也可以在異常處理部分引用。
PL/SQL程序塊可背獨立編譯並存儲在資料庫中,任何與資料庫相連接的應用程序都可以訪問這些存儲的PL/SQL程序塊。ORACLE提供了四種類型的可存儲的程序:
. 函數
. 過程
. 包
. 觸發器
函數
函數是命名了的、存儲在資料庫中的PL/SQL程序塊。函數接受零個或多個輸入參數,有一個返回值,返回值的數據類型在創建函數時定義。定義函數的語法如下:
FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]
過程
存儲過程是一個PL/SQL程序塊,接受零個或多個參數作為輸入(INPUT)或輸出(OUTPUT)、或既作輸入又作輸出(INOUT),與函數不同,存儲過程沒有返回值,存儲過程不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程序塊內部調用,定義存儲過程的語法如下:
PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]
包(package)
包其實就是被組合在一起的相關對象的集合,當包中任何函數或存儲過程被調用,包就被載入入內存中,包中的任何函數或存儲過程的子程序訪問速度將大大加快。
包由兩個部分組成:規范和包主體(body),規范描述變數、常量、游標、和子程序,包體完全定義子程序和游標。
觸發器(trigger)
觸發器與一個表或資料庫事件聯系在一起的,當一個觸發器事件發生時,定義在表上的觸發器被觸發。
變數和常量
變數存放在內存中以獲得值,能被PL/SQL塊引用。你可以把變數想像成一個可儲藏東西的容器,容器內的東西是可以改變的。
聲明變數
變數一般都在PL/SQL塊的聲明部分聲明,PL/SQL是一種強壯的類型語言,這就是說在引用變數前必須首先聲明,要在執行或異常處理部分使用變數,那麼變數必須首先在聲明部分進行聲明。
聲明變數的語法如下:
Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]
注意:可以在聲明變數的同時給變數強制性的加上NOT NULL約束條件,此時變數在初始化時必須賦值。
給變數賦值
給變數賦值有兩種方式:
. 直接給變數賦值
X:=200;
Y=Y+(X*20);
. 通過SQL SELECT INTO 或FETCH INTO給變數賦值
SELECT SUM(SALARY),SUM(SALARY*0.1)
INTO TOTAL_SALARY,TATAL_COMMISSION
FROM EMPLOYEE
WHERE DEPT=10;
常量
常量與變數相似,但常量的值在程序內部不能改變,常量的值在定義時賦予,,他的聲明方式與變數相似,但必須包括關鍵字CONSTANT。常量和變數都可被定義為SQL和用戶定義的數據類型。
ZERO_VALUE CONSTANT NUMBER:=0;
這個語句定了一個名叫ZERO_VALUE、數據類型是NUMBER、值為0的常量。
標量(scalar)數據類型
標量(scalar)數據類型沒有內部組件,他們大致可分為以下四類:
. number
. character
. date/time
. boolean
『拾』 oracle sql語句中,有沒有能夠將結果集中數字替換成漢字的函數
oracle sql語句中,有能夠將結果集中數字替換成漢字的函數,用decode()函數。