【问题标题】:How to execute or run .sql file inside stored procedure in oracle如何在oracle的存储过程中执行或运行.sql文件
【发布时间】:2017-10-05 06:33:29
【问题描述】:

我正在尝试创建存储过程来创建计划任务。它将每天执行我的 .sql 脚本。我的 .sql 文件包含创建表和删除表脚本。像这样

Drop table a608232_new_62K_master;

create table a608232_new_62K_master as select A.* from 
a608232_MRD_DATA_62K_W_Account A inner join a608232_new_mids B
on A.MID = B.MID;

更多这样的语句每天更新该表。我应该如何处理这个问题。我正在尝试创建过程,以便我可以安排任务来执行该过程。或者在 oracle 中是否有其他方法。

ps:我只有 1 个包含所有语句的 .sql 文件。

【问题讨论】:

  • 您是否考虑过使用 Oracle Scheduler 调度作业?
  • @TedatORCL.Pro 是的,但我不知道如何使用它来执行 .sql 文件?
  • 为什么要将脚本保存在文件中?有什么理由吗?它们会是 pl/sql 块吗?
  • @TedatORCL.Pro 是的,它们可以是 PL/SQL 块。我以前没有这样做过。所以不熟悉语法。如果我将它们保存在 PL/SQL 块中,我应该如何进行
  • BEGIN DBMS_SCHEDULER.CREATE_JOB (job_name => 'update_sales', job_type => 'STORED_PROCEDURE', job_action => 'OPS.SALES_PKG.UPDATE_SALES_SUMMARY', start_date => '28-APR-08 07.00.00 PM Australia/Sydney', repeat_interval => 'FREQ=DAILY;INTERVAL=2', /* 每隔一天 */ end_date => '20-NOV-08 07.00.00 PM Australia/Sydney', auto_drop => FALSE, job_class => 'batch_update_jobs', cmets => '我的新工作');结尾; /

标签: sql oracle stored-procedures job-scheduling


【解决方案1】:

我建议使用 Oracle Scheduler 使用 PL/SQL Packages Procs 执行您的脚本,并在 DDL 需要时使用 execute immediate。

希望对你有用。

问候,

泰德

【讨论】:

  • 我发现一种方法是使用执行 immidiate,但是当我有这样的声明 create table abd as select * from xyz where a='b' 时,它会给我带来问题。我必须在执行 immidiate 后使用单引号,但那些与 'b' 混淆
  • 使用 a = '''b'''
  • 感谢我的 proc 已创建,但在创建表时遇到问题。第一条语句正在执行,我可以删除表但无法创建它。它说特权不足
  • 我这样做是因为我想安排一个工作,每天运行这个过程来刷新表中的数据。
  • 那么你需要授予 proc 所在的架构/用户适当的权限。
【解决方案2】:

您可以将代码放在您的 .sql 文件中的存储过程中。

CREATE PROCEDURE myproc

AS

BEGIN

Drop table a608232_new_62K_master;

create table a608232_new_62K_master as select A.* from 
a608232_MRD_DATA_62K_W_Account A inner join a608232_new_mids B
on A.MID = B.MID;` 

END

然后您可以使用批处理文件和 Windows 任务计划程序自动执行此操作。

set MYDB= yourDBname
set MYUSER=youruser 
set MYPASSWORD=yourpassword 
set MYSERVER=yourservername 
sqlcmd -S %MYSERVER% -d %MYDB% -U %MYUSER% -P %MYPASSWORD% -h -1 -s "," -W -Q "exec myproc"

【讨论】:

  • 好吧,如果您将 DDL 语句放在这样的存储过程中,则会引发错误。如何解决这个问题
  • 我发现一种方法是使用执行 immidiate,但是当我有这样的声明 create table abd as select * from xyz where a='b' 时,它会给我带来问题。我必须在执行 immidiate 后使用单引号,但那些与 'b' 混淆
  • 您是否尝试过我作为新答案发布的查询,是否有效?
【解决方案3】:

尝试创建这样的表:

CREATE PROCEDURE myproc

AS

BEGIN

Drop table a608232_new_62K_master;

create table a608232_new_62K_master (col1, col2, col3...) -- Note: Its better to name the columns in the table, same as the columns used by the select query

insert into a608232_new_62K_master (col1, col2, col3...)
select A.col1, A.col2, A.col3 from 
a608232_MRD_DATA_62K_W_Account A 
inner join a608232_new_mids B
on A.MID = B.MID;` 

END

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2010-12-23
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多