如何在plsql中使用操作系统命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在plsql中使用操作系统命令相关的知识,希望对你有一定的参考价值。

一、前言:玩Oracle的人一般都是对电脑很内行的朋友,如果不是,操作中会碰到很多困难。服务器上安装Oracle 10G或其后版本的Oracle。服务器上安装JAVA运行环境。在本地服务器上先进行实验,用最权高登录操作系统权,用最高登录数据库的权。

二、具体方法:10G及其以后版本的Oracle数据库提供了对Java程序的更多的支持,可用调用JAVA的方法调用操作系统命令。

1. 首先我们创建调用操作系统命令的Java方法
create or replace and compile java source named oscmd as
import java.io.*;
import java.lang.*;
public class OSCmd extends Object 
    public static int OSCmd(String args) 
        Runtime rt = Runtime.getRuntime();
        int rc = -1;
        try 
            Process p = rt.exec(args);
            int bufSize = 4096;
            BufferedInputStream bis = new BufferedInputStream(p.getInputStream(), bufSize);
        int len;
        byte buffer[] = new byte[bufSize];
        while ((len = bis.read(buffer, 0, bufSize)) != -1)
                System.out.write(buffer, 0, len);
            rc = p.waitFor();
         catch (Exception e) 
            e.printStackTrace();
            rc = -1;
         finally 
            return rc;
        
    

2. 然后,再创建一个PL/SQL函数调用Java方法
CREATE
 OR REPLACE FUNCTION Run_Cmd(p_Cmd IN VARCHAR2) RETURN NUMBER AS 
LANGUAGE JAVA NAME \'OSCmd.OSCmd(java.lang.String) return integer\';
3. 之后我们就可以轻松的在Oracle程序中调用操作系统命令了
declare
    n number;
begin
    n := Run_Cmd(\'Copy C:\\temp.txt D:\\temp.txt\');
end;

三、补充说明:在Oracle的SQLPLUS下可以使用Host命令来执行操作系统级别的命令或者可执行文件,PL SQL作为第三方远程联接工具,是不能直接执行这种指令的。

参考技术A Linux:命令前面加上!或host
Windows:命令前面加上$或host

在 plsql 异常处理中返回命令无效吗?

【中文标题】在 plsql 异常处理中返回命令无效吗?【英文标题】:does return command invalid in plsql exception handling? 【发布时间】:2013-11-30 07:36:46 【问题描述】:

我查看了其他人编写的 plsql 代码,我发现他在异常块中使用了 return 命令,我已经在 java 编程中阅读过这不是一个好习惯,我还检查了一些 plsql 的异常示例,发现 return 不是使用过,所以有人可以确认这是无效的吗?

EXCEPTION WHEN OTHERS THEN
    create_log (  p_caller_user, 'E', '4', NULL
                , 'INTEREST_CALCULATION_TOOLS', 'CALCULATE_INTEREST'
                , V_SPY_COUNTER
                , 'UNEXPECTED ERROR DURING FUNCTION EXECUTION, ACC NO : '
                  || ',' || SQLERRM()
                  || p_account_id, SQLCODE(), SYSDATE);
    RETURN -2;

【问题讨论】:

手册对此事有何评论? @a_horse_with_no_name 手册没有写任何关于这个主题的内容。 PLSQL 函数返回一个值,可以是数字或其他对象类型。返回 -2;在从函数返回数字数据类型的函数中工作。程序不这样做,它们不返回某种值。要记住两件事 - plsql 是旧的,并且基于 ADA 编程的概念; plsql不是java。从 plsql 函数内部返回异常块内是可以的。您正在考虑的是代码的静态“复杂性” - 它随着多次返回而增加。并没有真正将相同的方式应用于 plsql。 【参考方案1】:

您的示例与上下文无关,因此无法说是否存在一些问题。代码 sn-p 可能在上下文中正确报告错误情况(由create_log-procedure),即使在others 异常处理程序中也是如此(这可能是问题的迹象,根据 Tom Kyte it's for sure )。

一般来说,我认为从 PL/SQL 函数非others 异常处理程序返回没有问题。

Oracle PL/SQL 文档只字未提:

Subprogram Parts RETURN Statement Continuing Execution After Handling Exceptions

当未找到可选值时,我通常使用以下模式返回默认值:

create or replace function f1 return dual.dummy%type is
  v_dummy dual.dummy%type;
begin
  select dummy into v_dummy from dual where dummy = 'Y';

  return v_dummy;
exception
  when no_data_found then
    return 'Z';
end;
/

(请注意,我只处理众所周知的错误情况,我知道应该如何处理这种情况。)

我发现替代方法不必要的冗长,尽管它会请返回一次纯粹主义者:

create or replace function f2 return dual.dummy%type is
  v_dummy dual.dummy%type;
begin
  begin
    select dummy into v_dummy from dual where dummy = 'Y';
  exception
    when no_data_found then
      v_dummy := 'Z';
  end;

  return v_dummy;
end;
/

编译打开所有警告的函数仅返回以下不相关的警告:

Warning: PLW-06015: parameter PLSQL_DEBUG is deprecated; use PLSQL_OPTIMIZE_LEVEL = 1
Warning(1,1): PLW-05018: unit F1 omitted optional AUTHID clause; default value DEFINER used

【讨论】:

【参考方案2】:

虽然它可能不会给出任何错误,但这样做根本不是一个好的编码习惯...... 请参考http://docs.oracle.com/cd/B10500_01/appdev.920/a96624/08_subs.htm

它明确规定“可执行部分包含语句,这些语句放置在关键字BEGIN和EXCEPTION(或END)之间。一个或多个RETURN语句必须出现在函数的可执行部分。异常处理部分包含异常处理程序, 位于关键字 EXCEPTION 和 END 之间。”

所以,即使它现在没有任何问题,你也不应该这样做。我希望这会有所帮助。

【讨论】:

以上是关于如何在plsql中使用操作系统命令的主要内容,如果未能解决你的问题,请参考以下文章

如何在plsql 执行导入导入语句: 在dos下能直接执行exp 和imp语句,但plsql下执行报错?

如何在plsql中执行存储过程

进入PLSQL的命令窗口,输入SQL语句后,应该如何执行?

C#WINFORM窗体怎么执行CMD命令?

如何用plsql将mdb文件导入到oracle数据库中

oracle中plsql与sqlplus的区别是啥啊?它们分别用来做啥啊?