當前位置:首頁 » 編程語言 » sql中emp是變數嗎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql中emp是變數嗎

發布時間: 2023-01-14 15:29:32

1. 怎麼將sql中select語句選出的值賦給個變數。C#中。

這要看select語句選出的值是什麼樣的值,是單個的值,還是一列值,如果是一個值,則定義一個變數直接賦值就好;如果是一列值,則可以用for循環給變數賦值。

2. 在sql Server中如何寫一個存儲過程存儲來獲取表emp_1的欄位,然後與表emp匹配插入數據

首先需要知道「另一個存儲過程」的結果集的所有列的類型。
假設「另一個存儲過程」的名字是sp1,沒有參數,返回的結果集共3列,全部為int型,那麼「存儲過程」里添加一個與結果集列數相同的臨時表或表變數用於接收「另一個存儲過程」的結果集
如下
CREATE PROCEDURE sp2
AS
DECLARE @t table(a int,b int,c int)

INSERT INTO @t(a,b,c)
EXEC sp1

SELECT * FROM @t
使用SQLSERVER存儲過程可以很大的提高程序運行速度,簡化編程維護難度,現已得到廣泛應用。
創建存儲過程
和數據表一樣,在使用之前需要創建存儲過程,它的簡明語法是:

引用:
Create PROC 存儲過程名稱
[參數列表(多個以「,」分隔)]
AS
SQL 語句

例:

引用:
Create PROC upGetUserName
@intUserId INT,
@ostrUserName NVARCHAR(20) OUTPUT -- 要輸出的參數
AS
BEGIN
-- 將uName的值賦給 @ostrUserName 變數,即要輸出的參數
Select @ostrUserName=uName FROM uUser Where uId=@intUserId
END

其中 Create PROC 語句(完整語句為Create PROCEDURE)的意思就是告訴SQL SERVER,現在需要建立一個存儲過程,upGetUserName 就是存儲過程名稱,@intUserId 和 @ostrUserName 分別是該存儲過程的兩個參數,注意,在SQL SERVER中,所有用戶定義的變數都以「@」開頭,OUTPUT關鍵字表示這個參數是用來輸出的,AS之後就是存儲過程內容了。只要將以上代碼在「查詢分析器」里執行一次,SQL SERVER就會在當前資料庫中創建一個名為「upGetUserName」的存儲過程。你可以打開「企業管理器」,選擇當前操作的資料庫,然後在左邊的樹型列表中選擇「存儲過程」,此時就可以在右邊的列表中看到你剛剛創建的存儲過程了(如果沒有,刷新一下即可)。
二、存儲過程的調用

之前已經創建了一個名為「upGetUserName」的存儲過程,從字面理解該存儲過程的功能是用來取得某一個用戶的名稱。存儲過程建立好了,接下來就是要在應用程序里調用了,下面看一下在ASP程序里的調用。

引用:
Dim adoComm
』// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
With adoComm
』// 設置連接,設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
』// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
』// 存儲過程名稱
.CommandText = "upGetUserName"
』// 設置用戶編號
.Parameters.Item("@intUserId").Value = 1
』// 執行存儲過程
.Execute

』// 取得從存儲過程返回的用戶名稱
Response.Write "用戶名:" & .Parameters.Item("@ostrUserName").Value
End With
』// 釋放對象
Set adoComm = Nothing

通過以上兩步,已經可以創建和使用簡單的存儲過程了。下面來看一個稍微復雜點的存儲過程,以進一步了解存儲過程的應用。
三、存儲過程的實際應用

用戶登錄在ASP項目中經常會使用到,但使用存儲過程來做驗證可能不多,那麼做例子,寫一個簡單的用戶登錄驗證的存儲過程。

引用:
Create PROC upUserLogin
@strLoginName NVARCHAR(20),
@strLoginPwd NVARCHAR(20),
@blnReturn BIT OUTPUT
AS
-- 定義一個臨時用來保存密碼的變數
DECLARE @strPwd NVARCHAR(20)
BEGIN
-- 從表中查詢當前用戶的密碼,賦值給 @strPwd 變數,下面要對他進行比較
Select @strPwd=uLoginPwd FROM uUser Where uLoginName=@strLoginName

IF @strLoginPwd = @strPwd
BEGIN
SET @blnReturn = 1
-- 更新用戶最後登錄時間
Update uUser SET uLastLogin=GETDATE() Where uLoginName=@strLoginName
END
ELSE
SET @blnReturn = 0
END

用戶登錄的存儲過程建立好了。注意,在一個區域內如果有多條語句時,必需使用BEGIN...END關鍵字。
引用:
Dim adoComm
』// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
With adoComm
』// 設置連接,設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
』// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
』// 存儲過程名稱
.CommandText = "upUserLogin"
』// 設置登錄名稱
.Parameters.Item("@strLoginName").Value = "***"
』// 設置登錄密碼
.Parameters.Item("@strLoginPwd").Value = "123456"
』// 執行存儲過程
.Execute

』// 判斷是否登錄成功
If .Parameters.Item("@blnReturn").Value = 1 Then
Response.Write "恭喜你,登錄成功!"
Else
Response.Write "不是吧,好像錯了哦。。。"
End If
End With
』// 釋放對象
Set adoComm = Nothing

通過以上的步驟,簡單用戶登錄驗證過程也做完了,現在只要把它整合到程序中就可以實現簡單的用戶登錄驗證了,關於其他細節就由你自己來處理了。
上面介紹的兩個存儲過程都是只返回一個值的,下面我們來看一個返回一個記錄集的存儲過程。

引用:
Create PROC upGetUserInfos
@intUserGroup INT
AS
BEGIN
-- 從資料庫中抽取符合條件的數據
Select uName,uGroup,uLastLogin FROM uUser Where uGroup=@intUserGroup
-- 插入一列合計
UNION
Select 』合計人數:』,COUNT(uGroup),NULL FROM uUser Where uGroup=@intUserGroup
END

現在我們來看一下ASP程序的調用。

引用:
Dim adoComm
Dim adoRt
』// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
Set adoRs = CreateObject("ADODB.Recordset")
With adoComm
』// 設置連接,設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
』// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
』// 存儲過程名稱
.CommandText = "upGetUserInfos"
』// 設置用戶組
.Parameters.Item("@intUserGroup").Value = 1
』// 執行存儲過程,和以上幾個例子不同,這里使用RecordSet的Open方法
adoRs.Open adoComm
』// 顯示第一個值
Response.write adoRs.Fields(0).Value
End With
』// 釋放對象
Set adoRs = Nothing
Set adoComm = Nothing

3. MS SQL 在存儲過程中怎樣執行用變數組合的SQL語句

創建:
create procere p_1
as
declare @empcode nvarchar(10)
declare @result nvarchar(20)
begin
set @empcode='1001'
select @result=c_name from employee where empcode=@empcode
print @result
end

執行:exec p_1

4. 如何將sql 中的數據查找並賦值給某個變數

1、代碼如下
declare
v_sal number;
begin
select sal from emp into v_sal where empno=7499;
dbms_output.put_line(v_sal);
end;
2、代碼就是將emp表中員工編號為7499的員工的sal欄位查詢出來賦值給v_sal並列印出來;

5. 基於emp表和dept表定義PL/SQL,使用替換變數輸入雇員姓名,輸出該雇員所在的部門信息

declarev_enamevarchar2(20);
v_deptnoint;
v_dnamevarchar2(20);
v_locvarchar2(20);
begin
selectb.deptno,b.dname,b.locintov_deptno,v_dname,v_locfromempa,deptbwherea.deptno=b.deptnoanda.ename=&v_ename;
dbms_output.put_line(v_deptno||','||v_dname||','||v_loc);
end;

執行時會提示你輸入v_ename的值,你就輸入一個人名比如SMITH

但是一定要在這上邊加引號


'SMITH' --這樣的

6. SQL資料庫

聲明
變數 v_emp_name 數據類型為 employee.emp_name;
變數 v_emp_phone 數據類型為employee.emp_phone;
變數 sql_str 數據類型varchar2(256);
begin
sql_str:='select emp_name, emp_phone from employee where emp_id=:eee';
這句話賦個值,下面這句分成幾段看比較好
execute immediate sql_str
執行上面的那句SQL
{into} v_emp_name, v_emp_phone
把查詢的結果放到v_emp_name和v_emp_phone 中
{using} 1 ;
那句SQL中有個:eee,這個變數用1代替即執行select emp_name, emp_phone from employee where emp_id=1
end;

第二個

declare
v_empid employee.empid%type := &v_empid;
①v_emp emp%rowtype;聲明一個可以存儲emp表一行的變數,我是這么理解的- -
begin
② select * into v_emp from employee where empid = v_empid;取出所有符合條件的結果,賦給v_empid
if ③SQL%found then如果有結果,則輸出結果中的empname和empphone值
dbms_output.put_line(v_emp.empname);
dbms_output.put_line(v_emp.empphone);
end if;
Exception此為所有例外情況
when④ no_data_found then這個是沒有記錄
dbms_output.put_line('havnt found record');
when⑤ too_many_rows then這個是row太多
dbms_output.put_line('too many record');
end;

7. SQL中全局變數和局部變數的用法

局部變數是用戶可自定義的變數,它的作用范圍僅在程序內部。在程序中通常用來儲存從表中查詢到的數據,或當作程序執行過程中暫存變數使用。局部變數必須以「@」開頭,而且必須先用DECLARE命令說明後才可使用。其說明形式如下:

DECLARE@變數名變數類型[@變數名變數類型…]

其中變數類型可以是sql server(WINDOWS平台上強大的資料庫平台) 2000支持的所有數據類型,也可以是用戶自定義的數據類型。
在Transact-SQL中不能像在一般的程序語言中一樣使用「變數=變數值」來給變數賦值。必須使用SELECT或SET命令來設定變數的值,其語法如下:

SELECT@局部變數=變數值
SET@局部變數=變數值1212

例:聲明一個長度為10 個字元的變數「id」並賦值

declare@idchar(10)
select@id=『10010001』1212

注意:可以在Select命令查詢數據時,在Select命令中直接將列值賦給變數。
例:查詢編號為「10010001」的員工和工資,將其分別賦予變數name和wage

usepangu
declare@namechar(30)@wagemoney
select@name=e_name,@wage=e_wage
fromemployee
whereemp_id='10010001'
select@namease_name,@wagease_wage123456123456

運行結果如下:

e_namee_wage
-----------------------------------------
張三8000.0000123123

注意:資料庫語言和編程語言有一些關鍵字,關鍵字是在某一一樣下能夠促使某一操作發生的字元組合,為避免沖突和產生錯誤,在命令表、列、變數以及其它對象時應避免使用關鍵字。

全局變數

全局變數是sql server(WINDOWS平台上強大的資料庫平台)系統內部使用的變數,其作用范圍並不局限於某一程序,而是任何程序均可隨時調用全局變數通常存儲一些sql server(WINDOWS平台上強大的資料庫平台)的配置設定值和效能統計數據。用戶可在程序中用全局變數來測試系統的設定值或Transact-SQL命令執行後的狀態值。有關sql server(WINDOWS平台上強大的資料庫平台) 全局變數的詳細情況請參見附錄。

注意:全局變數不是由用戶的程序定義的,它們是在伺服器級定應義的。只能使用預先說明及定義的變局變數。引用全局變數時,必須以「@@」開頭。局部變數的名稱不能與全局變數的名稱相同、否則會在應用中出錯。

8. SQl資料庫中包是什麼

一、什麼是PL/SQL包

包就是一個把各種邏輯相關的類型、常量、變數、異常和子程序組合在一起的模式對象。包通常由兩個部分組成:包說明和包體,但有時包體是不需要的。說明(簡寫為spec)是應用程序介面;它聲明了可用的類型、變數、常量、異常、游標和子程序,包體部分完全定義游標和子程序,並對說明中的內容加以實現。

如下例所示,我們可以認為說明部分是一個可選介面,而包體是一個"黑盒"。我們可以調試、增強或替換一個包體而不同改變介面(包說明)。

我們可以從SQL*Plus中使用CREATE PACKAGE語句來創建一個包。語法如下:

CREATE [OR REPLACE] PACKAGE package_name
[AUTHID {CURRENT_USER | DEFINER}]
{IS | AS}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constant_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_spec ...]
[function_spec ...]
[procere_spec ...]
[call_spec ...]
[PRAGMA RESTRICT_REFERENCES(assertions) ...]
END [package_name];

[CREATE [OR REPLACE] PACKAGE BODY package_name {IS | AS}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constant_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_body ...]
[function_spec ...]
[procere_spec ...]
[call_spec ...]
[BEGIN
sequence_of_statements]
END [package_name];]

在說明部分聲明的內容都是公有的,對應用程序是可見的。我們必須在所有的其他內容(除了用於為一個特殊的函數命名的編譯指示;這樣的編譯指示必須跟在函數說明之後)聲明之後才可以聲明子程序。

包體中的內容有私有的,它實現了說明部分定義的細節內容,並且對應用程序是不可見的。緊跟著包體聲明部分的是一個可選的初始化部分,它用於初始化包中的變數等。

AUTHID語句決定了是否是所有的打包子程序都按定義者許可權(默認)或調用者許可權執行,其中涉及到的模式對象是在定義者的模式中解析還是在調用者的模式中解析。

一個調用說明能讓我們在Oracle數據詞典中發布一個Java方法或外部C函數。調用說明靠把程序的名稱、參數類型和返回類型映射到它們的SQL副本(SQL counterpart)中來發布程序。

1、PL/SQL包舉例

在下面的例子中,我們把一個記錄類型、游標和兩個employment過程進行打包。要注意,過程hire_employee使用資料庫序列empno_seq和函數SYSDATE分別插入到欄位雇員編號和僱傭日期。

CREATE OR REPLACE PACKAGE emp_actions AS -- spec
TYPE emprectyp IS RECORD(
emp_id INT,
salary REAL
);

CURSOR desc_salary RETURN emprectyp;

PROCEDURE hire_employee(
ename VARCHAR2,
job VARCHAR2,
mgr NUMBER,
sal NUMBER,
comm NUMBER,
deptno NUMBER
);

PROCEDURE fire_employee(emp_id NUMBER);
END emp_actions;

CREATE OR REPLACE PACKAGE BODY emp_actions AS -- body
CURSOR desc_salary RETURN emprectyp IS
SELECT empno, sal
FROM emp
ORDER BY sal DESC;

PROCEDURE hire_employee(
ename VARCHAR2,
job VARCHAR2,
mgr NUMBER,
sal NUMBER,
comm NUMBER,
deptno NUMBER
) IS
BEGIN
INSERT INTO emp
VALUES (empno_seq.NEXTVAL,
ename,
job,
mgr,
SYSDATE,
sal,
comm,
deptno);
END hire_employee;

PROCEDURE fire_employee(emp_id NUMBER) IS
BEGIN
DELETE FROM emp
WHERE empno = emp_id;
END fire_employee;
END emp_actions;

只有在包說明部分的聲明內容對應用程序才是可見可訪問的;包體的詳細實現是不可見不可訪問的。所以,我們可以在不重新編譯調用程序的前提下修改包體(實現)。

二、PL/SQL包的優點

包提供了幾個優點:模塊化、方便應用程序設計、信息隱藏、附加功能和良好的性能。
模塊化
包能讓我們把邏輯相關的類型、常量、變數、異常和子程序等放到一個命名的PL/SQL模塊中。每一個包都容易理解,包與包之間介面簡單、清晰。這將有助於程序開發。

輕松的程序設計
設計應用程序時,我們首先要確定的是包說明中的介面信息。我們可以在沒有包體的條件下編寫並編譯說明部分。然後引用該包的存儲子程序也會被編譯。在完成整個應用程序之前,我們是不需要完全實現包體部分的。

信息隱藏
有了包,我們就可以指定哪些類型、常量、變數、異常和子程序等是公有(可見和可訪問)或私有(隱藏和不可訪問)。例如,如果一個包里包含了四個子程序,其中三個是公有的一個是私有的。包就會隱藏私有子程序的實現,這樣的話,如果實現內容發生改變,受到影響的只有包本身(不是我們的應用程序)。同樣,對用戶隱藏實現細節也能保證包的完整性。

附加功能
打包公有變數和游標在一個會話期會一直存在。所以,它們可以被當前環境下的所有子程序共享。並且它們允許我們跨事務來維護數據而不用把它保存在資料庫中。

良好的性能
在我們首次調用打包子程序時,整個包就會被載入到內存中。所以,以後調用包中的相關子程序時,就不需要再次讀取磁碟了。包能阻塞級聯依賴,這樣就能避免不必要的編譯。例如,如果我們改變打包函數的實現,Oracle不需要重新編譯調用子程序,因為它們並不依賴於包體。

三、理解包說明

包說明包括了公有聲明。這些聲明的作用於對於資料庫模式來說是本地的,對於包來說是全局的。所以,被聲明的內容可以從應用程序中和包的任何地方訪問。下圖演示了包的作用范圍:

說明中列出了包中對應用程序所有可用的資源。例如,下面的聲明演示了一個接受INTEGER類型的參數並返回一個INTEGER結果的函數fac:

FUNCTION fac (n INTEGER) RETURN INTEGER; -- returns n!

這些就是我們要調用的函數的所有信息。我們並不需要考慮它的實現細節(如,是使用迭代還是遞歸)。

只有子程序和游標有實現部分。所以,如果一個說明只有類型、常量、變數、異常的聲明和調用說明,那麼包體就沒有必要的了。下面就是一個沒有包體的包:

CREATE PACKAGE trans_data AS -- bodiless package
TYPE timerec IS RECORD(
minutes SMALLINT,
hours SMALLINT
);

TYPE transrec IS RECORD(
CATEGORY VARCHAR2,
ACCOUNT INT,
amount REAL,
time_of timerec
);

minimum_balance CONSTANT REAL := 10.00;
number_processed INT;
insufficient_funds EXCEPTION;
END trans_data;

包trans_data不需要包體,因為類型、常量、變數和異常並沒有實現部分。這樣的包能讓我們定義全局變數,可供子程序和資料庫觸發器使用。

1、引用包的內容

如果要引用包內聲明的類型、常量、變數、異常和子程序等,就得使用點標識:

package_name.type_name
package_name.item_name
package_name.subprogram_name
package_name.call_spec_name

我們可以從資料庫觸發器、存儲子程序、3GL(第三代程序語言)應用程序和各種Oracle工具中引用包中的內容。例如,我們可以從SQL*Plus中調用過程hire_employee:

SQL> CALL emp_actions.hire_employee('TATE', 'CLERK', ...);

下例中,我們可以從一個嵌入到Pro*C的匿名PL/SQL塊調用同樣的過程。實參emp_name和job_title是主變數(即聲明在主環境中的變數)。

EXEC SQL EXECUTE
BEGIN
emp_actions.hire_employee(:emp_name, :job_title, ...);

約束
我們不能直接或間接地引用遠程打包變數。例如,我們不能遠程調用下面的過程,因為它在參數初始化子句中引用了打包變數:

CREATE PACKAGE random AS
seed NUMBER;
PROCEDURE initialize (starter IN NUMBER := seed, ...);

同樣,我們也不能在包的內部引用主變數。
^ ^希望對你有幫助

9. 編寫一PL/SQL程序實現emp表中的ENAME、JOB、COMM、SAL四個欄位內容的輸出(用%type定義變數)。

-- Created on 2009-12-31 by ADMINISTRATOR
DECLARE
-- Local variables here
/*
編寫一PL/SQL程序實現emp表中的ENAME、JOB、COMM、SAL四個欄位內容的輸出(用%type定義變數)
*/
P_ENAME EMP.ENAME%TYPE;
P_JOB EMP.JOB%TYPE;
P_COMM EMP.COMM%TYPE;
P_SAL EMP.SAL%TYPE;
CURSOR CUR_EMP IS
SELECT EMP.ENAME, EMP.JOB, EMP.COMM, EMP.SAL FROM EMP EMP;
BEGIN
-- Test statements here
FOR rec_cur IN CUR_EMP LOOP
P_ENAME := rec_cur.ename;
P_JOB := rec_cur.JOB;
P_COMM := rec_cur.COMM;
P_SAL := rec_cur.SAL;

dbms_output.put_line('EMP.ENAME%TYPE:'||P_ENAME);
dbms_output.put_line('EMP.JOB%TYPE:'||P_JOB);
dbms_output.put_line('EMP.COMM%TYPE:'||P_COMM);
dbms_output.put_line('EMP.SAL%TYPE:'||P_SAL);

dbms_output.put_line('------------------------------');

END LOOP;
END;

10. 如何在SQL中聲明一個數組變數以及相關SQL語

集合:是具有相同定義的元素的聚合。Oracle有兩種類型的集合:

可變長數組(VARRAY):可以有任意數量的元素,但必須預先定義限制值。

嵌套表:視為表中之表,可以有任意數量的元素,不需要預先定義限制值。

在PL/SQL中是沒有數組(Array)概念的。但是如果程序員想用Array的話,就得變通一下,用TYPE 和Table of Record來代替多維數組,一樣挺好用的。
emp_type 就好象一個table 中的一條record 一樣,裡面有id, name,gender等。emp_type_array 象個table, 裡面含有一條條這樣的record (emp_type),就象多維數組一樣。

--單維數組
DECLARE
TYPE emp_ssn_array IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;

best_employees emp_ssn_array;
worst_employees emp_ssn_array;

BEGIN
best_employees(1) := '123456';
best_employees(2) := '888888';

worst_employees(1) := '222222';
worst_employees(2) := '666666';

FOR i IN 1..best_employees.count LOOP
DBMS_OUTPUT.PUT_LINE('i='|| i || ', best_employees= ' ||best_employees(i)
|| ', worst_employees= ' ||worst_employees(i));
END LOOP;

END;

--多維數組
DECLARE

TYPE emp_type IS RECORD
( emp_id employee_table.emp_id%TYPE,
emp_name employee_table.emp_name%TYPE,
emp_gender employee_table.emp_gender%TYPE );

TYPE emp_type_array IS TABLE OF emp_type INDEX BY BINARY_INTEGER;

emp_rec_array emp_type_array;
emp_rec emp_type;

BEGIN
emp_rec.emp_id := 300000000;
emp_rec.emp_name := 'Barbara';
emp_rec.emp_gender := 'Female';

emp_rec_array(1) := emp_rec;

emp_rec.emp_id := 300000008;
emp_rec.emp_name := 'Rick';
emp_rec.emp_gender := 'Male';

emp_rec_array(2) := emp_rec;

FOR i IN 1..emp_rec_array.count LOOP
DBMS_OUTPUT.PUT_LINE('i='||i
||', emp_id ='||emp_rec_array(i).emp_id
||', emp_name ='||emp_rec_array(i).emp_name
||', emp_gender = '||emp_rec_array(i).emp_gender);
END LOOP;

END;
-------------- Result --------------
i=1, emp_id =300000000, emp_name =Barbara, emp_gender = Female
i=2, emp_id =300000008, emp_name =Rick, emp_gender = Male