当前位置:首页 » 服务存储 » ins存储过程
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

ins存储过程

发布时间: 2022-09-25 19:20:35

‘壹’ postgresql 存储过程的事务处理

一个PostgreSQL存储过程的例子

需求:
给出如下条件进行批处理编排
- 开始日期时间
- 重复间隔(分钟)
- 重复次数
要求在档期内重复安排节目播出, 比如: 2003.01.01 08:00 开始每隔240分钟播出一次, 一共播出100次

数据库表格(CO_SCHEDULE)
------------------------------
N_PROGID INT
DT_STARTTIME TIMESTAMP
DT_ENDTIME TIMESTAMP

存储过程的实现:

create table co_schele(n_progid int,dt_starttime timestamp,dt_endtime timestamp);

//创建函数:
create function add_program_time(int4,timestamp,int4,int4,int4) returns bool as '
declare
prog_id alias for $1;
ration_min alias for $3;
period_min alias for $4;
repeat_times alias for $5;
i int;
starttime timestamp;
ins_starttime timestamp;
ins_endtime timestamp;
begin
starttime :=$2;
i := 0;
while i<repeat_times loop
ins_starttime := starttime;
ins_endtime := timestamp_pl_span(ins_starttime,ration_min || ''mins'');
starttime := timestamp_pl_span(ins_starttime,period_min || ''mins'');
insert into co_schele values(prog_id,ins_starttime,ins_endtime);
i := i+1;
end loop;
if i<repeat_times then
return false;
else
return true;
end if;
end;
'language 'plpgsql';

//执行函数:
select add_program_time(1,'2002-10-20 0:0:0','5','60','5');

//查看结果:select * from co_schele;
n_progid | dt_starttime | dt_endtime
----------+------------------------+------------------------
1 | 2002-10-20 00:00:00+08 | 2002-10-20 00:05:00+08
1 | 2002-10-20 01:00:00+08 | 2002-10-20 01:05:00+08
1 | 2002-10-20 02:00:00+08 | 2002-10-20 02:05:00+08
1 | 2002-10-20 03:00:00+08 | 2002-10-20 03:05:00+08
1 | 2002-10-20 04:00:00+08 | 2002-10-20 04:05:00+08

ps:
1.数据库一加载 plpgsql语言。如没有,
su - postgres
createlang plpgsql dbname
2.至于返回类型为bool,是因为我不知道如何让函数不返回值。等待改进。

‘贰’ oracle 如何在包里创建一个简单的函数和存储过程

25、包
(1)定义包头
语法:
CREATE [OR REPLACE] PACKAGE [schame_name.]<包名>
IS | AS
包描述

包描述:可以是变量、常量及数据类型定义和游标定义,也可以是存储过程、函数定义和参数列表返回值类型。
例:
CREATE OR REPLACE PACKAGE employeePackage
AS
--类型定义
Type empRecType is record(
Empno number(4),
Salary number
)

--变量定义
p1 varchar2(20);
type t_departmentNo table is table of dept.deptno%type
index by binary_integer;

--游标定义
Cursor order_sal retrurn EmpRecType;

--聘用员工过程
Procere HireEmployee(p_EmpNo emp.empno%type);

End employeePackage;
例:
CREATE OR REPLACE PACKAGE scott.pkg_displayproct
IS
procere prc_getproctinfo
(
pid scott.proct.prodid%type,
pname out scott.proct.prodname%type,
ctname out scott.proct.CATEGORYID%type,
dscp out scott.proct.description%type
);
function fun_getstock
(
pid scott.proct.prodid%type
)
return number;
END pkg_displayproct;
(2)定义包体
语法:
CREATE OR REPLACE PACKAGE BODY [schame_name.]<包名>
IS | AS
包体描述;
END 包名;

包名:将要创建的包名称,该名称可以和包头所在的包名相同,也可以不同。
包体描述:游标、存储过程或者函数的定义
包体是可选的,如果在包头中没有声明任何存储过程或者函数,则包体就不存在,即使在包头有变量、游标或者类型的声明
(3)引用包中对象
BEGIN
[schame_name.][包名.]对象名;
END;

‘叁’ 用SQL语句创建存储过程

--1、创建存储过程--
if
exists
(select
*
from
sysobjects
where
name='info1')
drop
procere
info1
go
create
procere
info1
@sname
varcher(20),
as
begin
declear
@xinxi
varcher(20)
set
@xinxi='select
学号,姓名,出身日期,系别(注,列名自己设置)
from
student
where
姓名=@sname'
print'@xinxi';
end
--调用存储过程1--
exec
info1
@sname=姓名
后面的自己参考,可以写出来

‘肆’ 存储过程调用存储过程的语法

执行存储过程proc2,调用了存储过程proc1
create prco proc1
as
begin
print '被执行的存储过程proc1'
end

create proc proc2
as
begin
exec proc1
end

exec proc2

‘伍’ 在naviat直接调用存储过程call OA.INS_USER(171201); 运行结果正确,在PHP中调用存储过程结果不正确

关于这个问题,我不是怎么很明白,你既然找不到解答,你去后盾逛一下吧!不管是小白,还是转行在那里都可以解决,任何问题在那里都不是问题,不介意可以去看看/

‘陆’ oracle数据库的游标和存储过程怎么写

--创建存储

CREATE
OR
REPLACE
PROCEDURE
xxxxxxxxxxx_p
(
--参数IN表示输入参数
OUT表示输入参数
类型
使用任意Oracle

类型
is_ym
IN
CHAR
)
AS
--定义变量
vs_msg
VARCHAR2(4000);
--错误信息变量
vs_ym_beg
CHAR(6);
--起始月份
vs_ym_end
CHAR(6);
--终止月份
vs_ym_sn_beg
CHAR(6);
--同期起始月份
vs_ym_sn_end
CHAR(6);
--同期终止月份
--定义游标(简单

遍历

集)
CURSOR
cur_1
IS
SELECT
area_code,CMCODE,SUM(rmb_amt)/10000
rmb_amt_sn,SUM(usd_amt)/10000
usd_amt_sn
FROM
BGD_AREA_CM_M_BASE_T
WHERE
ym
>=
vs_ym_sn_beg
AND
ym
<=
vs_ym_sn_end
GROUP
BY
area_code,CMCODE;BEGIN
--用输入参数给变量赋初值

Oralce
SUBSTR
TO_CHAR
ADD_MONTHS
TO_DATE


函数
vs_ym_beg
:=
SUBSTR(is_ym,1,6);
vs_ym_end
:=
SUBSTR(is_ym,7,6);
vs_ym_sn_beg
:=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'),
-12),'yyyymm');
vs_ym_sn_end
:=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'),
-12),'yyyymm');
--先删除表
特定条件
数据
DELETE
FROM
xxxxxxxxxxx_T
WHERE
ym
=
is_ym;
--
用内置
DBMS_OUTPUT

put_line
打印
影响
记录行数


系统变量SQL%rowcount
DBMS_OUTPUT.put_line('del
月记录='||SQL%rowcount||'条');
INSERT
INTO
xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT
area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM
BGD_AREA_CM_M_BASE_T
WHERE
ym
>=
vs_ym_beg
AND
ym
<=
vs_ym_end
GROUP
BY
area_code,CMCODE;
DBMS_OUTPUT.put_line('ins
月记录='||SQL%rowcount||'条');
--遍历游标处理
更新

遍历游标
几种
用for语句

比较直观

FOR
rec
IN
cur_1
LOOP
UPDATE
xxxxxxxxxxx_T
SET
rmb_amt_sn
=
rec.rmb_amt_sn,usd_amt_sn
=
rec.usd_amt_sn
WHERE
area_code
=
rec.area_code
AND
CMCODE
=
rec.CMCODE
AND
ym
=
is_ym;
END
LOOP;
COMMIT;
--错误处理部
OTHERS表示除
声明外
任意错误
SQLERRM
系统内置变量保存
前错误
详细信息
EXCEPTION
WHEN
OTHERS
THEN
vs_msg
:=
'ERROR
IN
xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--
前错误记录进
志表
INSERT
INTO
LOG_INFO(proc_name,error_info,op_date)
VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);
COMMIT;
RETURN;
END;

‘柒’ oracle存储过程并且怎么写

存储过程(procere):是一个命名了的语句块,可以有0个或多个参数

语法:

create or replace procere HelloWorld
as
begin
dbms_output.put_line('HelloWorld');
end;

调用存储过程
* 命令调用 exec helloworld
* 语句块调用
begin
helloworld;
end;
/

DELETE:

create or replace procere del_emp01
is
begin
delete from emp01 where empno=7369;
end;

exec del_emp01;

create or replace procere del_emp01(v_empno in emp01.empno%type)
is
begin
delete from emp01 wherer empno=v_empno;
end;

exec del_emp01(7521);

INSERT

create or replace procere ins_emp01
(v_empno emp01.empno%type,v_ename emp01.ename%type)
as
begin
insert into emp01(empno,ename) values(v_empno,v_ename);
end;

exec ins_emp01(1000,'李四');

UPDATE

create or replace procere upd_emp01
(v_empno emp01.empno%type,v_ename emp01.ename%type)
as
begin
update emp01 set ename=v_ename where empno=v_empno;
end;

exec upd_emp01(1000,'张三');

SELECT
create or replace procere sel_emp01
(v_empno emp01.empno%type,v_emp01_data out emp01%rowtype)
as
begin
select * into v_emp01_data from emp where empno=v_empno;
end;

带有输出参数的存储过程不能使用命令直接调用

只能由语句块或程序调用(JAVA) ****************************************************************
declare
v_emp_data emp01%rowtype;
begin
sel_emp01(7499,v_emp_data);
dbms_output.put_line(v_emp_data.ename||' '||v_emp_data.sal);
end;
调用:
declare
v_emp_data emp01%rowtype;
begin
sel_emp01(7499,v_emp_data);
dbms_output.put_line(v_emp_data.ename||' '||v_emp_data.sal);
end;
使用scott用户登录
统计某个部门的员工的工资总和,员工的人数,平均工资,创建存储过程
create or replace procere deptcount
(v_deptno emp.deptno%type,v_sal_sum out number,v_recordes out number,v_avg_sal out number,errorMsg out varchar2)
is
begin
select sum(sal) into v_sal_sum from emp group by deptno having deptno=v_deptno;
select count(*) into v_recordes from emp group by deptno having deptno=v_deptno;
select avg(sal) into v_avg_sal from emp group by deptno having deptno=v_deptno;
exception
when no_data_found then
errorMsg:='没有该部门';
end;
调用:
declare
v_sal_sum number;
v_recordes number;
v_avg_sal number(8,2);
v_errormsg varchar2(20);
begin
deptcount(90,v_sal_sum,v_recordes,v_avg_sal,v_errormsg);
dbms_output.put_line(v_sal_sum||' '||v_recordes||' '||v_avg_sal);
dbms_output.put_line(v_errormsg);
end;

//输出参数
create or replace procere my_pro(v_num in number,v_result out number)
is
v_temp number;
begin
v_temp:=0;
for i in 1..v_num
loop
v_temp:=v_temp+i;
end loop;
v_result:=v_temp;
end;
declare
v_recieve number;
begin
my_pro(100,v_recieve);
dbms_output.put_line(v_recieve);
end;
//既是输入参数又是输出参数
create or replace procere my_pro1(v_i in out number)
is
v_j number;
begin
v_j:=30;
v_i:=v_i*v_j;
end;

declare
v_t number;
begin
v_t:=20;
my_pro1(v_t);
dbms_output.put_line(v_t);
end;

‘捌’ oracle生成insert语句的存储过程怎么写

你可以用oracle的UTL_FILE包,直接将文件生成到服务器上。

下面给你个例子。测试环境windows2008 + oracle11g。

Blob,Clob类型不能导出,导出的文本适用于sqlserver.

createtableTest_Gsh(
aCharvarchar2(20),
bNumnumber,
cDatedate);

insertintoTest_Gsh(aChar,bNum,cDate)
select'这',1,sysdatefromal
unionall
select'是',2,sysdatefromal
unionall
select'测',3,sysdatefromal
unionall
select'试',4,sysdatefromal
unionall
select'UTL_FILE',5,sysdatefromal
unionall
select'的',to_Number(null),Nullfromal
unionall
select'例子',to_Number(null),Nullfromal;

--建立目录
createdirectoryUTL_FILE_GAOas'c:';
--建立过程
createorreplaceprocereout_File_Testas
vFileNamevarchar2(50);
vFilePathvarchar2(30);
out_fileutl_file.file_type;
vBackupTimevarchar2(30);
begin
vBackupTime:=to_Char(sysdate,'yyyymmddhh24miss');
dbms_output.put_line(vBackupTime);
vFilePath:='UTL_FILE_GAO';
vFileName:='Test_Gsh'||vBackupTime||'.sql';
dbms_output.put_line(vFileName);
out_file:=utl_file.fopen(vFilePath,vFileName,'w');
utl_file.put_line(out_file,'--备份表:Test_Gsh');
utl_file.put_line(out_file,'--备份时间:'||vBackupTime);
forrin(select'insertintoTest_Gsh(aChar,bNum,cDate)values('||
casewhenaCharisnullthen'Null'elseChr(39)||aChar||Chr(39)end||','||
casewhenbNumisnullthen'Null'elseto_Char(bNum)end||','||
casewhencDateisnullthen'Null'else'cast('||Chr(39)||to_Char(cDate,'yyyymmddhh24miss')||Chr(39)||'asdateTime)'end||
');'insData
fromTest_Gsh)loop
utl_file.put_line(out_file,r.InsData);
endloop;
utl_file.FCLOSE(out_file);
exception
whenothersthen
dbms_output.put_line(sqlerrm);
utl_file.FCLOSE(out_file);
end;
/

‘玖’ sql中执行存储过程参数如何取表中查询值

没懂你要问什么。
如果你你要给存储过程传递参数,用IN 关键字,例如:
CREATE DEFINER=`vemdm`@`%` PROCEDURE `pr_insert_softlogday`(IN ins_DNname VARCHAR(20),IN sel_DNname VARCHAR(20),IN starttime VARCHAR(20),IN endtime VARCHAR(20))
BEGIN

SET @sqlcmd = CONCAT("INSERT INTO ",ins_DNname,"(softname,softversion,citycode,s_work,usetimes,s_day)
SELECT softname,softversion,citycode,workcustom s_work,SUM(usetimes) usetimes,create_time s_day FROM (
SELECT a.mac,a.citycode,a.workcustom,b.softname,b.softversion,b.usetimes,b.create_time FROM
(SELECT * FROM ",sel_DNname," a WHERE create_time BETWEEN '",starttime,"' AND '",endtime,"')b JOIN
(SELECT mac,citycode,workcustom FROM `terminal_unit`) a ON
a.mac = b.mac)c GROUP BY softname,softversion,citycode,workcustom");
PREPARE temp FROM @sqlcmd;
EXECUTE temp;
END$$
DELIMITER ;
这个我传递了3个参数。
如果你你要用存储过程查结果,建议改为用视图或者函数,存储过程默认是没有返回值的。所以你拿不到结果