使用plsql存储过程制造一个脚本如:
10年积累的网站设计、成都网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有全南免费网站建设让你可以放心的选择与我们合作。
create or replace procedure test_val
(etl_date varchar2, --时间或者数字变量
data out sys_refcursor ---存放数据
) as
s_sql varchar2(1000); --执行sql
begin
s_sql := 'SELECT A,B FROM tsalpludetail' || etl_date ;
--dbms_output.put_line(s_sql);----打印sql可以不需要
open data for s_sql; ---把结果集放入data
end test_val;
执行后,打开存储过程
最后查看数据
至此完成
办法是有的,就是特别麻烦,需要又重循环,第一重,循环所有表,第二重,循环特定表中的字段,然后将所有满足条件的表名和字段名插入到一张新的表中,然后再自己分析结果,确认究竟是哪个表哪个字段, 仅提供思想而已,需要息写一个procedure 或者function实现。
在后面加点东西,或者在前面加点东西就行了。
比如,tmp_表名_to_char(sysdate,'yyyymmddHH24')
看你多长时间执行一次,如果1天,那么就yyyymmdd就好,如果一个小时,那么就hh24,如果怕tmp被用了那么就t_m_p_,反正比较特殊就行。
但是注意别太长啊,我记得oracle的表名有长度限制的,是多少忘记了,dba_tables的table_name字段的长度。
觉得你应该先弄清楚oracle的常规数据字典的结构,像9i里的常规数据字典中对象名称就有以user,all,dba为前缀的对象。
以user为例,我们查该对象下有些什么表,就应该执行下列的语句:
sqlselect
table_name
from
user_tables;
类似的,你可以进行替换。:)
如果你想查数据库中所有的表的话,可以查询
select
*
from
dba_tables
如果你想查询数据库中某个用户下的表的话,也可以登录这个用户,再查询:
select
*
from
user_tables
要想导入外部sql语句可以用命令
sql
@e:\文件名.sql
如你想保存
select
*
from
tablename;语句的结果,可以在sql*plus
里面这样:
spool
c:\test.sql
//这是保存文件的位置
select
*
from
tablename;
spool
off
例如你指定写入的表为t_table_column表,过程传入参数为表用户,表名
create or replace procedure p_check_table(owner in varchar2,
table_name in varchar2) as
v_owner varchar2(100) := null;
v_table varchar2(200) := null;
v_table_num number(10) := null;
v_column clob := null;
begin
v_owner := upper(owner);
v_table := upper(table_name);
select count(1)
into v_table_num
from all_tables t
where t.OWNER = v_owner
and t.TABLE_NAME = v_table;
if v_table_num = 0 then
dbms_output.put_line(v_owner || '.' || v_table || ':表不存在');
return;
end if;
v_column := null;
for i in (select t.COLUMN_NAME, t.COLUMN_ID
from all_tab_columns t
where t.OWNER = v_owner
and t.TABLE_NAME = v_table
order by COLUMN_ID) loop
v_column := v_column || ',' || i.column_name;
end loop;
insert into t_table_column
(owner, table_name, column_name)
values
(v_owner, v_table, v_column);
commit;
exception
when others then
rollback;
dbms_output.put_line(v_owner || '.' || v_table || '异常' || sqlerrm);
end p_check_table;
/
动态SQL 实质就是执行的SQL字符串,所以你完全可以用拼接的方式,先把 字符串 拼接出来,然后用execute immediate 'sql' 来执行;
至于如果拼接出来 SQL,那就需要你去找规律,其实你可以对字符串做对此拼接,例如一下:str1 :='SELECT QW,QE,QR FROM Q WHERE Q=1';
str2 :='SELECT QW,COUNT(1) FROM EW,' || str1 || 'WHERE EW=QW GROUP BY QW;'
这类问题 完全属于个别案例,因为SQL的规律只有你自己最清楚,谁都无法提供一个完整的解决方案!