当前位置:首页 » 编程语言 » 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