(作者:陈玓玏)
上一篇记录的是通过自定义函数复制表的笔记,但是觉得过程还是有些麻烦。觉得还是用存储过程更简洁些,今天就把存储过程的写法整理出来了。下面代码用的时候记得把相应位置变量替换成你自己的。
--使用存储过程复制表,使用存储过程来复制表比使用自定义函数更简单,因为自定义函数返回多行结果需要用游标,但带游标的查询语句不能用于create as。
create or replace procedure createtable(tname in varchar2,id in number)
--sql_sent是用来存储sql语句的临时变量,存储过程可以不设置返回值,这也是它和自定义函数的重要区别
sql_sent varchar2(20000);
begin
sql_sent:='create table '||tname||' as select col from tableName where id='||id;
execute immediate sql_sent;
commit;
--执行存储过程
exec createtable('new_tablename',112);
上面是比较简单的参数传入,涉及到时间参数时,处理起来会麻烦一些,时间参数如下:
上面是比较
//复制join之后的表,并将时间作为传入的参数。这个地方很容易出错,首先就是单引号的问题,需要再加单引号实现转义
,所以最好是用dbms_output.put_line(sql_sent);输出sql语句看一下是否正确
create or replace procedure createtable(tname in varchar2,date_time in varchar2)
sql_sent varchar2(20000);
begin
sql_sent:='''yyyy-mm-dd''';
sql_sent:='create table '||tname||' as select * from tableName where trunc(sa_time)>=to_date('||date_time||','||sql_sent||')';
--这样拼接的字符串作SQL语句常常容易出现拼写的问题,所以最好是输出语句检查一下是否存在问题
dbms_output.put_line(sql_sent);
execute immediate sql_sent;
commit;
--执行存储过程
exec createtable('newTableName','''2018-09-01''');
(作者:陈玓玏)上一篇记录的是通过自定义函数复制表的笔记,但是觉得过程还是有些麻烦。觉得还是用存储过程更简洁些,今天就把存储过程的写法整理出来了。下面代码用的时候记得把相应位置变量替换成你自己的。--使用存储过程复制表,使用存储过程来复制表比使用自定义函数更简单,因为自定义函数返回多行结果需要用游标,但带游标的查询语句不能用于create as。create or replace proce...
多年前写的复制目标数据库指定表的数据到本地表。
程序丢了可惜,分享下。
执行存储过程,通过指定目标数据库登录信息,动态生成dblink,打开游标,按批次插入本地指定表中,每批次1万条数据。同步记录和日志信息写在自动生成的sync_log表中。同步完成后自动删除动态生成的存储过程、dblink。
本程序不同步blob和clob字段,玩oracle的人都懂,用sql同步此类数据,速度上不去,此类数据应该要用导出导入的方式提升速度。
具体请参阅程序,可根据自已需要进行修改。
参数说明:
CREATE OR REPLACE PROCEDURE syncTable(
ip IN VARCHAR2,--目标数据库ip地址
port IN NUMBER,--目标数据库端口号
sid varchar2,--目标数据库SID
ora_user VARCHAR2,--目标数据库登录用户名
passwd VARCHAR2,--目标数据库登录密码
src_table_name IN VARCHAR2,--目标数据需要同步的表(数据源)
dest_table_name IN VARCHAR2,--把目标表同步到本地库的表名,无则创建与目标表一致的表名
errMsg OUT VARCHAR2)--输出执行信息。
程序同步到执行结束时的目标表所有数据,不按任何字段排序,只判断并记录row_number()到日志表,中断后重新执行可继续同步,如果目标表频繁读写,不保证数据完全正常,故最好是目标表不变动情况下执行同步。
有问题请私信或留言。
在存储过程中,where 条件 in( 变量 );这样的方式,in()里面只能存放一个值,像in('test')这样,但是,当in('test1','test2','test3')这样的形式就没有作用。
需要将 in( 变量 )中的变量格式化。用Oracle的正则表达式。因为我在Java后台封装的String为 String str = "test1,test2,test3...";这种 所以...
[code="sql"]
create or replace procedure SP_G902005(TeburuName VARCHAR, --テーブル
RESULT OUT INT --結果(0:成功; -1:失敗)
) i...
Oracle中
复制表或者
复制表结构
1.
复制表结构及其数据:
create table table_name_new as select * from table_name_old
2. 只
复制表结构(后面加where条件):
create table table_name_new as select * from table_name_old where 1=0;
关于JAVA调用
ORACLE存储过程时,传入
动态参数作为in语句条件的问题
需求:需要将多个
参数作为一个
参数传给
存储过程执行,如:
参数'1000','2000','3000','4000'等多个
参数
作为一个字符串
参数传递给
存储过程PROC_RPT110(?)。
存储过程将这个
参数作为查询语句
in('1000','2000','3000','4000')的条件查询多个值。
Oracle存储过程中的OUT参数是用来在存储过程执行完成后将结果返回给调用程序的参数。在定义存储过程时,OUT参数需要使用关键字 OUT 来声明,在调用存储过程时需要提供一个变量来接收返回值。例如:
CREATE OR REPLACE PROCEDURE get_employee_name (emp_id IN NUMBER, emp_name OUT VARCHAR2) AS
BEGIN
SELECT name INTO emp_name FROM employees WHERE id = emp_id;
调用该存储过程如下
DECLARE
emp_name VARCHAR2(100);
BEGIN
get_employee_name(1, emp_name);
DBMS_OUTPUT.PUT_LINE(emp_name);