① sql怎麼聲明 變數
聲明局部變數語法:DECLARE @variable_name DataType其中 variable_name為局部變數的名稱,DataType為數據類型。
給局部變數賦值有兩種方法:
1、SET @variable_name=value
2、SELECT @variable_name=value
兩者的區別:SET賦值語句一般用於賦給變數一個指定的常量,SELECT賦值語句一般用於從表中查詢出數據然後賦給變數。
例如:DECLARE @count int
SET @count=123
PRINT @count
全局變數:由於全局變數是系統定義的,我們這里只做舉例。
@@ERROR 最後一個T-SQL錯誤的錯誤號
@@IDENTITY 最後一次插入的標識值
@@LANGUAGE 當前使用的語言名稱
@@MAX_CONNECTIONS 可以創建的同時連接的最大數目
@@SERVERNAME 本地伺服器的名稱
@@VERSION SQL Server的版本信息
② SQL常量是什麼變數是什麼局量是什麼
常量就是定值,不會變動的值,如1,2,'a','abc'
變數通常指局部變數,僅當前會話有效,以@符號開頭的,可以存儲不同值的一種佔位符
如declare @a int set @a=1 定義變數@a為int類型,並賦值為1
局量說的應該是全局變數了吧,通常是以@@開頭的一些系統變數
如@@version顯示資料庫及操作系統的版本信息
③ oracle pl/sql中如何使用變數
定義並使用變數
PL/SQL有四種類型:標量類型,復合類型,引用類型 (reference),LOB(Large Obejct)類型
一、標量類型
最常用的就是標量類型,是指只能存放單個數值的變數,包括數字類型、字元類型、日期類型和布爾類型,每種類型又包含相應的子類型。
常量標量類型如下:
VARCHAR2 (n) , CHAR (n), NUMBER (p,s),DATE, TIMESTAMP , LONG , LONG RAW ,BOOLEAN,BINARY_INTEGER(僅 PL / SQL使用),BINARY_FLOAT和BINARY_DOUBLE(10g新引入的)
定義標量:
identifier [CONSTANT] datatype [NOT NULL] [:=| DEFAULT expr]
使用標量需要注意的是=號被:=取代,與delphi一樣的賦值符號@_@
例子:
v_name VARCHAR2 ( 10 );
v_rate CONSTANTS NUMBER ( 4 , 2 ) : = 3.04 ;
為了防止定義的變數類型與表中的欄位類型不一致,可以使用%TYPE來定義:
v_name employee.name % TYPE;
如上面所示,v_name的類型就與表 employee中的name欄位類型一樣!!
二、復合變數:
用於存放多個值的變數稱為復合變數,包括PL/SQL記錄,PL/SQL表,嵌套表和VARRAY四種類型
1.PL/SQL記錄
類似於C/C++中的結構概念:
declare
TYPE employee_record is RECORD(
id employee.id % TYPE,
name employee.name % TYPE,
email employee.email % TYPE);
em_record employee_record;
begin
select id,name,email into em_record from employee where name =& name;
dbms_output.put_line( ' 雇員名: ' || em_record.name || ' 雇員ID: ' || em_record.id);
end ;
2.PL/SQL表,類似於數組概念,不同的是PL/SQL表允許負值下標,而且沒有上下限,如:
declare
TYPE employee_table is table of employee.name % TYPE index by BINaRY_INTEGER;
em_table employee_table;
begin
select name into em_table( - 1 ) from employee where name =& name;
dbms_output.put_line( ' 雇員名: ' || em_table( - 1 ));
end ;
3.嵌套表,與PL/SQL 表相似,不同的是嵌套表可以做表列的數據類型,而PL/SQL表不能,使用嵌套表作為表列時,必須為其指定專門的存儲表,如:
create or replace TYPE emp_type as OBJECT(name VARCHAR2 ( 10 ),salary NUMBER ( 6 , 2 ),hiredate DATE);
CREATE OR REPLACE TYPE emp_array IS TABLE OF emp_type;
CREATE TABLE department(
deptno NUMBER ( 2 ),dname VARCHAR2 ( 10 ),
employee emp_array)NESTED TABLE employee STORE as employee_dept;
4.VARRAY(變長數組),與嵌套表相似,也可以做為表列的數據類型,但是嵌套表沒有個數限制,而VARRAY有個數限制,如:
CREATE TYPE TEST_ARRAY IS VARRAY(20) OF emp_type;
三、引用變數(reference)
類似於C++中的指針或者JAVA中引用的概念,用於存放數值指針的變數,使用此變數,可以使得應用程序共享相同對象,降低佔用空間。此類有兩種類型:游標(REF CURSOR)和對象類型(REF OBJECT)
1.REF CURSOR,定義時同時指定SELECT語句的游標稱為顯式或者靜態游標,在打開時才指定SELECT語句的游標稱為動態游標,如:
DECLARE
TYPE c1 IS REF CURSOR ;
emp_cursor c1;
v_name employee.name % TYPE;
v_sal employee.salary % TYPE;
begin
open emp_cursor for
SELECT name,salary FROM EMPLOYEE ;
LOOP
FETCH emp_cursor INTO v_name,v_sal;
EXIT WHEN emp_cursor % NOTFOUND;
dbms_output.put_line(v_name);
END LOOP;
close emp_cursor;
end ;
2.REF OBJECT,與JAVA的引用概念相同,存儲的是指向對象的指針
四、LOB類型
LOB類型是指用於存儲大批量數據的變數,包括內部的3種(CLOB,BLOB,NCLOB)和外部LOB(BFILE)。
CLOB,NCLOB用於存儲大量的字元數據。
BLOB用於存儲大批量二進制數據(如圖象)。
BFILE則存儲指向OS文件的指針。
④ PL/SQL基礎的觸發器
觸發器(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
表1顯示了數字數據類型;表2顯示了字元數據類型;表3顯示了日期和布爾數據類型。
表1 Scalar Types:Numeric
Datatype
Range
Subtypes
description
BINARY_INTEGER
-214748-2147483647
NATURAL
NATURAL
NPOSITIVE
POSITIVEN
SIGNTYPE
用於存儲單位元組整數。
要求存儲長度低於NUMBER值。
用於限制范圍的子類型(SUBTYPE):
NATURAL:用於非負數
POSITIVE:只用於正數
NATURALN:只用於非負數和非NULL值
POSITIVEN:只用於正數,不能用於NULL值
SIGNTYPE:只有值:-1、0或1.
NUMBER
1.0E-130-9.99E125
DEC
DECIMAL
DOUBLE
PRECISION
FLOAT
INTEGERIC
INT
NUMERIC
REAL
SMALLINT
存儲數字值,包括整數和浮點數。可以選擇精度和刻度方式,語法:
number[([,])]。
預設的精度是38,scale是0.
PLS_INTEGER
-2147483647-2147483647
與BINARY_INTEGER基本相同,但採用機器運算時,PLS_INTEGER提供更好的性能 。
表2 字元數據類型
datatype
rang
subtype
description
CHAR
最大長度32767位元組
CHARACTER
存儲定長字元串,如果長度沒有確定,預設是1
LONG
最大長度2147483647位元組
存儲可變長度字元串
RAW
最大長度32767位元組
用於存儲二進制數據和位元組字元串,當在兩個資料庫之間進行傳遞時,RAW數據不在字元集之間進行轉換。
LONGRAW
最大長度2147483647
與LONG數據類型相似,同樣他也不能在字元集之間進行轉換。
ROWID
18個位元組
與資料庫ROWID偽列類型相同,能夠存儲一個行標示符,可以將行標示符看作資料庫中每一行的唯一鍵值。
VARCHAR2
最大長度32767位元組
STRINGVARCHAR
與VARCHAR數據類型相似,存儲可變長度的字元串。聲明方法與VARCHAR相同
表3 DATE和BOOLEAN
datatype
range
description
BOOLEAN
TRUE/FALSE
存儲邏輯值TRUE或FALSE,無參數
DATE
01/01/4712 BC
存儲固定長的日期和時間值,日期值中包含時間
LOB數據類型
LOB(大對象,Large object) 數據類型用於存儲類似圖像,聲音這樣的大型數據對象,LOB數據對象可以是二進制數據也可以是字元數據,其最大長度不超過4G。LOB數據類型支持任意訪問方式,LONG只支持順序訪問方式。LOB存儲在一個單獨的位置上,同時一個LOB定位符(LOB locator)存儲在原始的表中,該定位符是一個指向實際數據的指針。在PL/SQL中操作LOB數據對象使用ORACLE提供的包DBMS_LOB.LOB數據類型可分為以下四類:
. BFILE
. BLOB
. CLOB
. NCLOB
操作符
與其他程序設計語言相同,PL/SQL有一系列操作符。操作符分為下面幾類:
. 算術操作符
. 關系操作符
. 比較操作符
. 邏輯操作符
算術操作符如表4所示
operator
operation
+
加
-
減
/
除
*
乘
**
乘方
關系操作符主要用於條件判斷語句或用於where子串中,關系操作符檢查條件和結果是否為true或false,表5是PL/SQL中的關系操作符
operator
operation
<
小於操作符
<=
小於或等於操作符
>
大於操作符
>=
大於或等於操作符
=
等於操作符
!=
不等於操作符
<>
不等於操作符
:=
賦值操作符
表6 顯示的是比較操作符
operator
operation
IS NULL
如果操作數為NULL返回TRUE
LIKE
比較字元串值
BETWEEN
驗證值是否在范圍之內
IN
驗證操作數在設定的一系列值中
表7.8顯示的是邏輯操作符
operator
operation
AND
兩個條件都必須滿足
OR
只要滿足兩個條件中的一個
NOT
取反
⑤ SQL Server中能不能定義常量
你可以定義變數,在整個過程中只要不改變該變數的值,跟常量有什麼區別
declare @cname varchar(50)
set @cname='aa'
⑥ SQL如何表示第一個字母是常量,後面4個數字是變數
常量就是定值,不會變動的值,如1,2,'a','abc'
變數通常指局部變數,僅當前會話有效,以@符號開頭的,可以存儲不同值的一種佔位符
如declare @a int set @a=1 定義變數@a為int類型,並賦值為1
局量說的應該是全局變數了吧,通常是以@@開頭的一些系統變數
如@@version顯示資料庫及操作系統的版本信息
⑦ [SQL]update語句中where條件數值能否用一個常量或變數代替呢
DECLARE @number varchar(80)
SET @number= '123'
update 表1 set fname = (select fname from 表2 where fitem = '4' and fnumber =@number) where fnumber = @number
⑧ sql變數問題
肯定不是啊。。
如果你給同一個變數進行多次賦值,那這個變數的值就是最後一個值。
變數它的值是會變的。也就是可以改的嘛
⑨ sqlplus中define定義的常量和variable定義的變數的區別
前兩天看到有人在pub上問在sqlplus中通過define和variable定義的變數的區別。其實define定義的我理解不是變數而是字元常 量,通過define定義之後,在通過&或者&&引用的時候不需要輸入了,僅此而已。oracle在執行的時候自動用值進行了替 換;而variable定義的是綁定變數。
C:>sqlplus xys/manager
SQL*Plus: Release 11.1.0.6.0 - Proction on 星期二 4月 1 14:03:00 2008
Copyright (c) 1982, 2007, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Proction
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> define
DEFINE _DATE = "01-4月 -08" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "db11" (CHAR)
DEFINE _USER = "XYS" (CHAR)
DEFINE _PRIVILEGE = "" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1101000600" (CHAR)
DEFINE _EDITOR = "Notepad" (CHAR)
DEFINE _O_VERSION = "Oracle Database 11g Enterprise Edition Release 11.1.0.
6.0 - Proction
With the Partitioning, OLAP, Data Mining and Real Application Testing options" (
CHAR)
DEFINE _O_RELEASE = "1101000600" (CHAR)
SQL> select *from tt;
ID NAME
---------- ----------
1 a
2 a
3 "abc"
SQL> define a
SP2-0135: 符號 a 未定義
SQL> define a=1
SQL> define
DEFINE _DATE = "01-4月 -08" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "db11" (CHAR)
DEFINE _USER = "XYS" (CHAR)
DEFINE _PRIVILEGE = "" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1101000600" (CHAR)
DEFINE _EDITOR = "Notepad" (CHAR)
DEFINE _O_VERSION = "Oracle Database 11g Enterprise Edition Release 11.1.0.
6.0 - Proction
With the Partitioning, OLAP, Data Mining and Real Application Testing options" (
CHAR)
DEFINE _O_RELEASE = "1101000600" (CHAR)
DEFINE A = "1" (CHAR)
--通過上面顯示define定義的應該是字元(串)常量。
SQL> select * from tt where id=&a;
原值 1: select * from tt where id=&a
新值 1: select * from tt where id=1
ID NAME
---------- ----------
1 a
SQL> select * from tt where id=&&a;
原值 1: select * from tt where id=&&a
新值 1: select * from tt where id=1
ID NAME
---------- ----------
1 a
SQL> define b='a';
SQL> define
DEFINE _DATE = "01-4月 -08" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "db11" (CHAR)
DEFINE _USER = "XYS" (CHAR)
DEFINE _PRIVILEGE = "" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1101000600" (CHAR)
DEFINE _EDITOR = "Notepad" (CHAR)
DEFINE _O_VERSION = "Oracle Database 11g Enterprise Edition Release 11.1.0.
6.0 - Proction
With the Partitioning, OLAP, Data Mining and Real Application Testing options" (
CHAR)
DEFINE _O_RELEASE = "1101000600" (CHAR)
DEFINE A = "1" (CHAR)
DEFINE B = "a" (CHAR)
--如果是字元類型那麼在引用時別忘了加上單引號,另外通過define定義之後在引用時不需要輸入了。
SQL> select * from tt where name=&&b;
原值 1: select * from tt where name=&&b
新值 1: select * from tt where name=a
select * from tt where name=a
*
第 1 行出現錯誤:
ORA-00904: "A": 標識符無效
SQL> select * from tt where name='&&b';
原值 1: select * from tt where name='&&b'
新值 1: select * from tt where name='a'
ID NAME
---------- ----------
1 a
2 a
SQL> select * from tt where name='&b';
原值 1: select * from tt where name='&b'
新值 1: select * from tt where name='a'
ID NAME
---------- ----------
1 a
2 a
--執行sql時進行了替換
SQL> select sql_text from v$sql where sql_text like 'select * from tt where name
=%';
SQL_TEXT
--------------------------------------------------------------------------------
select * from tt where name=1
select * from tt where name='a'
SQL>
--==============================================
--variable定義的是綁定變數
SQL> variable a number;
SQL> print a;
A
----------
SQL> exec :a:=1;
PL/SQL 過程已成功完成。
SQL> select * from tt where id=:a;
ID NAME
---------- ----------
1 a
SQL> select sql_text from v$sql where sql_text like 'select * from tt where id=:
a%';
SQL_TEXT
--------------------------------------------------------------------------------
select * from tt where id=:a
SQL> print a;
A
----------
1
SQL>