程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> SQL*Plus中替換變量與定義變量,sqlplus

SQL*Plus中替換變量與定義變量,sqlplus

編輯:Oracle教程

SQL*Plus中替換變量與定義變量,sqlplus


替換變量

SQL*Plus中的替換變量又叫替代變量,它一般用來臨時存儲相關數據;在SQL語句之間傳遞值。一般使用&或&&前綴來指定替換變量. 關於使用替換變量,一般是利用其創建通用的腳本或達到和用戶交換目的。如下所示:

例如,我需要查看表的相關信息,如果不使用替換變量,每次查詢我都要修改腳本。非常不便,如果使用替換變量,我們可以將下面腳本存放在tab.sql腳本中,每次運行時,只需要輸入替換變量的值就可以了。

COL LOGGING FOR A7;
 
COL OWNER FOR A12;
 
COL TABLE_NAME FOR A30
 
COL TABLESPACE_NAME FOR A30
 
SELECT OWNER, TABLE_NAME, TABLESPACE_NAME, STATUS, COMPRESSION, 
       LOGGING, PARTITIONED, NUM_ROWS,
       TO_CHAR(LAST_ANALYZED,'YY-MM-DD HH24:MI:SS') LAST_ANALYZED
 
FROM DBA_TABLES 
 
    WHERE TABLE_NAME LIKE '&table_name_like%'
 
    ORDER BY TABLE_NAME;
 

 

epps> @tab.sql
Enter value for table_name_like: EMP
old   4:  WHERE  TABLE_NAME LIKE '&table_name_like%'
new   4:  WHERE  TABLE_NAME LIKE 'EMP%'
 
OWNER     TABLE_NAME       TABLESPACE_NAME      STATUS   COMPRESS LOGGING PAR   NUM_ROWS LAST_ANALYZED
------- --------------- ---------------------- -------- -------- ------- --- ---------- -----------------
SCOTT        EMP               USERS             VALID    DISABLED YES     NO          14 09-07-20 22:00:12
WIPOWNER     EMPLOYEE_MASTER   WIPOWNER_DATA     VALID    DISABLED YES     NO       12084 14-09-07 14:08:22
 
epps> @tab.sql
Enter value for table_name_like: DEPT
old   4:  WHERE  TABLE_NAME LIKE '&table_name_like%'
new   4:  WHERE  TABLE_NAME LIKE 'DEPT%'
 
OWNER     TABLE_NAME    TABLESPACE_NAME    STATUS   COMPRESS LOGGING PAR   NUM_ROWS LAST_ANALYZED
------- -------------- ------------------ -------- -------- ------- --- ---------- -----------------
SCOTT       DEPT                USERS       VALID    DISABLED YES     NO           4 09-07-20 22:00:12
 
epps> 

如果替換變量為數字類型,那麼可以直接是&+變量名稱,如下所示&DEPTNO,

SQL> SELECT deptno, dname, loc 
  2  FROM SCOTT.DEPT
  3  WHERE DEPTNO= &DEPTNO;
Enter value for deptno: 10
old   3: WHERE DEPTNO= &DEPTNO
new   3: WHERE DEPTNO= 10
 
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

如果是字符串類型或日期類型,最好使用單引號將其包裹起來,否則在輸入變量值時則必須加上單引號,不那樣做就會報錯,如下所示。

SQL> SELECT deptno, dname, loc 
  2  FROM SCOTT.DEPT
  3  WHERE DNAME= &DNAME;
Enter value for dname: SALES
old   3: WHERE DNAME= &DNAME
new   3: WHERE DNAME= SALES
WHERE DNAME= SALES
             *
ERROR at line 3:
ORA-00904: "SALES": invalid identifier
 
SQL> SELECT deptno, dname, loc 
  2  FROM SCOTT.DEPT
  3  WHERE DNAME= &DNAME;
Enter value for dname: 'SALES'
old   3: WHERE DNAME= &DNAME
new   3: WHERE DNAME= 'SALES'
 
    DEPTNO DNAME          LOC
---------- -------------- -------------
        30 SALES          CHICAGO

 

關於替換變量中&與&&的區別,兩者區別在於作用范圍不一樣,&引用的替換變量只在當前SQL有效,而&&引用的替換變量則在當前會話有效。下面以人們經常引用的例子來說明

SQL> SELECT 2+&NUM FROM DUAL;
Enter value for num: 2
old   1: SELECT 2+&NUM FROM DUAL
new   1: SELECT 2+2 FROM DUAL
 
       2+2
----------
         4
 
SQL> SELECT 3+&NUM FROM DUAL;
Enter value for num: 3
old   1: SELECT 3+&NUM FROM DUAL
new   1: SELECT 3+3 FROM DUAL
 
       3+3
----------
         6
 
SQL> SELECT 2+&&NUM FROM DUAL;
Enter value for num: 2
old   1: SELECT 2+&&NUM FROM DUAL
new   1: SELECT 2+2 FROM DUAL
 
       2+2
----------
         4
 
SQL> SELECT 3+&&NUM FROM DUAL;
old   1: SELECT 3+&&NUM FROM DUAL
new   1: SELECT 3+2 FROM DUAL
 
       3+2
----------
         5

 

小知識1:在存儲過程或包體裡面,經常有在字符串中使用&的情況,執行腳本時,經常會將這些字符串視為替換變量,要求輸入值,這樣煩不甚煩,其實只需要設置一下SQL*PLUS的環境變量即可避免這種情況。通常通過SET DEFINE OFF

小知識2:如果要顯示SQL*Plus使用替換值替換後的腳本文件,可以使用SET VERIFY ON/OFF 命令

 

SQL> SET VERIFY OFF
SQL> SELECT 2+&NUM FROM DUAL;
 
       2+2
----------
         4
 
SQL> SET VERIFY ON
SQL> SELECT 2+&NUM FROM DUAL;
old   1: SELECT 2+&NUM FROM DUAL
new   1: SELECT 2+2 FROM DUAL
 
       2+2
----------
         4
 

 

用戶定義變量

使用DEFINE定義了的變量(或許我們可以叫其定義常量,和C/C++中的DEFINE非常類似),可以使用&引用聲明的變量。其作用范圍或生命周期通常是整個會話。如果定義了變量後,需要清除變量,則可以使用UNDEFINE清除變量,使用DEFINE VARIABLE來查看變量

SQL> DEFINE NUM=2;            --定義變量
SQL> DEFINE NUM                    --查看變量
DEFINE NUM             = "2" (CHAR)
SQL> SELECT 2+&NUM FROM DUAL;      --引用變量
old   1: SELECT 2+&NUM FROM DUAL
new   1: SELECT 2+2 FROM DUAL
 
       2+2
----------
         4
 
SQL> UNDEFINE NUM;               --清除變量
SQL> SELECT 2+&NUM FROM DUAL;    --清除變量後,&NUM變成替換變量了。需要輸入值
Enter value for num: 

 

小知識點:查看當前會話下,SQL*Plus下定義的變量

SQL> define

DEFINE _DATE = "11-SEP-14" (CHAR)

DEFINE _CONNECT_IDENTIFIER = "epps" (CHAR)

DEFINE _USER = "SYS" (CHAR)

DEFINE _PRIVILEGE = "AS SYSDBA" (CHAR)

DEFINE _SQLPLUS_RELEASE = "1002000400" (CHAR)

DEFINE _EDITOR = "ed" (CHAR)

DEFINE _O_VERSION = "Oracle Database 10g Release 10.2.0.4.0 - Production" (CHAR)

DEFINE _O_RELEASE = "1002000400" (CHAR)

 

 

VARIABLE變量和DEFINE變量不同的是其需要指定變量類型,類似編程語言中的強類型和弱類型變量。前者用於綁定變量,後者是用於&或&&進行變量替換

 

SQL> VAR NUM NUMBER;

SQL> EXEC :NUM :=10;

PL/SQL procedure successfully completed.

SQL> PRINT NUM;

NUM

----------

10

 

DECLARE定義變量則一般用於PL/SQL中。一般大家也用得比較多。在此不做說明。

參考資料:

http://www.doc88.com/p-783671200732.html

http://blog.itpub.net/9933980/viewspace-627702/

http://blog.csdn.net/haiross/article/details/15340489


sql中的變量定義

你的用法有錯誤,變量不能這樣使用的,
as在SQL中是別名的用法,它可以為表名取別名,也可以為列名取別名,
其作用主要是為了增加可讀性。
示例:為列取別名的兩種寫法
1、字段名 as 別名 注:as 也可以省略

select id as 編號,name as 姓名 from table1

這句也可以寫成:

select id 編號,name 姓名 from table1

2、用等號來使用別名

select 編號=id,姓名=name from table1

其效果和前兩個語句一樣

示例2:為表名取別名的用法

select a.id 編號,name 姓名 from table1 as a join table2 as b on a.id=b.id

其中as 也可以省略。
 

SQL中用戶可以定義局部變量,也可以定義全局變量對

可以。在數據庫編程中很常用到,比如oracle中,聲明在包package體內的,對整個包中的存儲過程、函數等都可見,也就是整個包中的全局變量。而在函數體內或者存儲過程內定義的變量則屬於局部變量了
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved