ORACLE 中user_jobs调用 存储过程

---我建立的存储过程如下,意思是建立一个以当前日期命名的表,例如xin20090205
---(在sql窗口执行)
create or replace PROCEDURE SP_CREATE_TABLE
(
on_flag OUT NUMBER,
out_reason OUT VARCHAR2
)
is
v_sql varchar2(2000);
v_now_date varchar2(8);
v_table_name varchar2(3);

begin

select to_char(sysdate,'yyyymmdd') into v_now_date from dual;
select 'xin' into v_table_name from dual;

v_sql :='create table '||v_table_name||''||v_now_date||'';
v_sql :=v_sql || ' as select * from abc;
EXECUTE IMMEDIATE v_sql;
commit;

EXCEPTION
WHEN OTHERS
THEN
on_flag := SQLCODE;
out_reason := SUBSTR (SQLERRM, 1, 255);
ROLLBACK;
END;

----然后定时每天执行(在命令窗口执行)

VARIABLE jobno number;
begin
DBMS_JOB.SUBMIT(:jobno,
'SP_CREATE_TABLE;',
SYSDATE,'sysdate+1/24/12');

commit;
end;
/

然后报告错误
ORA-06550: 第 1 行, 第 93 列:
PLS-00905: 对象 DIZZY.SP_CREATE_TABLE 无效
ORA-06550: 第 1 行, 第 93 列:
PL/SQL: Statement ignored
ORA-06512: 在 "SYS.DBMS_JOB", line 79
ORA-06512: 在 "SYS.DBMS_JOB", line 136
ORA-06512: 在 line 2
jobno
---------

请问是怎么回事?能给我讲讲怎么改么?

VARIABLE jobno number;
begin
DBMS_JOB.SUBMIT(:jobno,
'SP_CREATE_TABLE;',
SYSDATE,'sysdate+1/24/12');
commit;
end jobno;

你这个就是我给你写的吧?

在里边执行下边的,把下边这些放到job里:

DECLARE
on_flag NUMBER;
out_reason VARCHAR2(4000);
BEGIN

-- Now call the stored program
sp_create_table(on_flag,out_reason);

-- Output the results
:a0 := on_flag;
:a1 := out_reason;

EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SubStr('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM, 1, 255));
RAISE;
END;

对了,还不行的话你就换个工具,换toad,找到job,时间设置好了

还有,大妹子,你分真多,哈

不好意思啊,我这老报一个ora-01008的错误,没弄明白
---------------------------------------------------------------------
OK,解决,那些乱七八糟的要绑定变量,程序和执行的你都改一下吧
程序改成:
create or replace PROCEDURE SP_CREATE_TABLE
(
on_flag OUT NUMBER,
out_reason OUT VARCHAR2
)
is
v_sql varchar2(2000);
v_now_date varchar2(8);
v_table_name varchar2(3);

begin

select to_char(sysdate,'yyyymmdd') into v_now_date from dual;
select 'xin' into v_table_name from dual;

v_sql :='create table '||v_table_name||''||v_now_date||' as select * from abc';
EXECUTE IMMEDIATE v_sql;

commit;

EXCEPTION
WHEN OTHERS
THEN
on_flag := SQLCODE;
out_reason := SUBSTR (SQLERRM, 1, 255);
ROLLBACK;
END;

程序执行体改成:

DECLARE
on_flag NUMBER;
out_reason VARCHAR2(4000);
BEGIN

-- Now call the stored program
sp_create_table(on_flag,out_reason);

END;

应该是万无一失了,再有问题留言吧
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网