如何编写存储过程

如何编写存储过程,第1张

//创建存储过程

CREATE PROCEDURE userData(

IN id INT

)

BEGIN

SELECT * from userdata WHERE userflag = id

END

其中IN是传进去的变量;

drop procedure userData//销毁这个存储过程。

call userData(2) //调用存储过程。

扩展资料:

sql中的存储过程及相关介绍:

CREATE PROCEDURE [拥有者.]存储过程名[程序编号]

[(参数#1,…参数#1024)]

[WITH

{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}

]

[FOR REPLICATION]

AS 程序行

其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数

(SQL Server 7.0以上版本),参数的使用方法如下:

@参数名数据类型[VARYING] [=内定值] [OUTPUT]。

每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。

[内定值]相当于我们在建立数据库时设定一个字段的默认值,这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的,也就是在调用了这个存储过程时,如果所指定的参数值是我们需要输入的参数。

同时也需要在结果中输出的,则该项必须为OUTPUT,而如果只是做输出参数用,可以用CURSOR,同时在使用该参数时,必须指定VARYING和OUTPUT这两个语句。

参考资料来源:百度百科-储存过程

/*--bcp 实现二进制文件的导入导出

支持image,text,ntext字段的导入/导出

image适合于二进制文件,包括:Word文档,Excel文档,图片,音乐等

text,ntext适合于文本数据文件

注意:导入时,将覆盖满足条件的所有行

导出时,将把所有满足条件的行导出到指定文件中

此存储过程仅用bcp实现

邹建 2003.08-----------------*/

/*--调用示例

--数据导出

exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:\zj1.dat'

--数据导入

exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:\zj1.dat','',0

--*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

drop procedure [dbo].[p_binaryIO]

GO

Create proc p_binaryIO

@servename varchar (30),--服务器名称

@username varchar (30), --用户名

@password varchar (30),--密码

@tbname varchar (500), --数据库..表名

@fdname varchar (30), --字段名

@fname varchar (1000),--目录+文件名,处理过程中要使用/覆盖:@filename+_temp

@tj varchar (1000)='', --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀

@isout bit=1--1导出((默认),0导入

AS

declare @fname_in varchar(1000)--bcp处理应答文件名

,@fsize varchar(20)--要处理的文件的大小

,@m_tbname varchar(50)--临时表名

,@sql varchar(8000)

--则取得导入文件的大小

if @isout=1

set @fsize='0'

else

begin

create table #tb(可选名 varchar(20),大小 int

,创建日期 varchar(10),创建时间 varchar(20)

,上次写 *** 作日期 varchar(10),上次写 *** 作时间 varchar(20)

,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int)

insert into #tb

exec master..xp_getfiledetails @fname

select @fsize=大小 from #tb

drop table #tb

if @fsize is null

begin

print '文件未找到'

return

end

end

--生成数据处理应答文件

set @m_tbname='[##temp'+cast(newid() as varchar(40))+']'

set @sql='select * into '+@m_tbname+' from(

select null as 类型

union all select 0 as 前缀

union all select '+@fsize+' as 长度

union all select null as 结束

union all select null as 格式

) a'

exec(@sql)

select @fname_in=@fname+'_temp'

,@sql='bcp "'+@m_tbname+'" out "'+@fname_in

+'" /S"'+@servename

+case when isnull(@username,'')='' then ''

else '" /U"'+@username end

+'" /P"'+isnull(@password,'')+'" /c'

exec master..xp_cmdshell @sql

--删除临时表

set @sql='drop table '+@m_tbname

exec(@sql)

if @isout=1

begin

set @sql='bcp "select top 1 '+@fdname+' from '

+@tbname+case isnull(@tj,'') when '' then ''

else ' where '+@tj end

+'" queryout "'+@fname

+'" /S"'+@servename

+case when isnull(@username,'')='' then ''

else '" /U"'+@username end

+'" /P"'+isnull(@password,'')

+'" /i"'+@fname_in+'"'

exec master..xp_cmdshell @sql

end

else

begin

--为数据导入准备临时表

set @sql='select top 0 '+@fdname+' into '

+@m_tbname+' from ' +@tbname

exec(@sql)

--将数据导入到临时表

set @sql='bcp "'+@m_tbname+'" in "'+@fname

+'" /S"'+@servename

+case when isnull(@username,'')='' then ''

else '" /U"'+@username end

+'" /P"'+isnull(@password,'')

+'" /i"'+@fname_in+'"'

exec master..xp_cmdshell @sql

--将数据导入到正式表中

set @sql='update '+@tbname

+' set '+@fdname+'=b.'+@fdname

+' from '+@tbname+' a,'

+@m_tbname+' b'

+case isnull(@tj,'') when '' then ''

else ' where '+@tj end

exec(@sql)

--删除数据处理临时表

set @sql='drop table '+@m_tbname

end

--删除数据处理应答文件

set @sql='del '+@fname_in

exec master..xp_cmdshell @sql

go

分几个步骤

1,创建输出路径,比如你要在c盘test目录下输出,你就先要建立好这个test路径

2,sqlplus下以sysdba登录,执行以下语句

3,create or replace directory TMP as 'c:\test'

4,grant read,write on directory TMP to 你要生成文件的用户

5,alter system set utl_file_dir='c:\test' scope=spfile

以上步骤执行完,需要重启数据库

6,最重要的一步开始了,创建存储过程

create or replace PROCEDURE SP_OUTPUT

is

file_handle utl_file.file_type

Write_content VARCHAR2(1024)

Write_file_name VARCHAR2(50)

v_id int

v_form varchar2(10)

cursor cur_sp_out

is

select id,form from a

begin

open cur_sp_out

loop

    fetch cur_sp_out into v_id,v_form

    exit when cur_sp_out%notfound

    write_file_name := to_char(SYSDATE,'YYYYMMDD')||'.txt'

    file_handle := utl_file.fopen('TMP',write_file_name,'a')

    write_content := v_id||' '||v_form

    --write file

    IF utl_file.is_open(file_handle) THEN

     utl_file.put_line(file_handle,write_content)

    END IF

    --close file

    utl_file.fclose(file_handle)

    end loop

    close cur_sp_out

end

我建立了一个跟你一样的测试表,数据如下

create table a(id int,

form varchar2(10))

insert into a values (1,'你好')

insert into a values (2,'你很好')

然后执行存储过程

begin

 SP_OUTPUT

end

执行完毕后,你在c盘test路径下会发现已经有新文件生成

文件内容

存储过程的话,如果表名和字段名跟你一致的话,你无须修改


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12071405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存