标签: sqlplus

如何在shell脚本中捕获SQLPlus退出代码?

我有一个KornShell(ksh)脚本,它登录到SQL*Plus并执行脚本.在shell脚本中,我想捕获已执行的SQL语句的状态代码.目前SQL存在错误,我无法通过检查$?来捕获它.如何从sql语句中捕获成功或错误代码并将其传递给shell脚本.

ksh脚本片段:

sqlplus $JDBC_FBUID_U/$JDBC_FBPWD_U@$JDBC_FBDB @${FBC_HOME}/FBCS003.sql ${outputfile}
if [ $? != 0 ]
then
  msg_txt="The execution of Sql script /tmp/FBCS003.sql failed.  Please investigate."
  echo ${msg_txt}
  echo ${msg_txt} | mailx -r ${fromemail} -s "FBCB003: The execution of Sql script /tmp/FBCS003.sql failed." ${toemail}
  epage -n ${pagerdef} ${pagernum} "FBCB003: ${msg_txt}"
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

SQL脚本FBCS003.sql

-- Set SQLPlus variables.
SET NEWPAGE 0
SET WRAP OFF
SET LINESIZE 9999
SET ECHO OFF
SET FEEDBACK OFF
SET VERIFY OFF
SET HEADING OFF
SET PAGESIZE 0
SET COLSEP …
Run Code Online (Sandbox Code Playgroud)

error-handling shell scripting ksh sqlplus

8
推荐指数
1
解决办法
4万
查看次数

转储sqlplus中的函数或过程的主体

使用sqlplus连接到oracle数据库时,如何转出函数体或程序体?

sql oracle sqlplus

8
推荐指数
2
解决办法
1万
查看次数

通过ssh隧道使用oracle db.错误"ORA-12541:TNS:没有听众"

您好我通过隧道从数据中心访问Oracle DB时遇到问题.

我们有一个非常标准的数据中心,一台机器可以从外部访问(我把它的IP放在/ etc/hosts文件中作为dc)和Oracle DB里面.我们在内部网络上的oracle数据库的IP地址是192.168.1.7

要创建隧道我正在使用命令:

 ssh -L 1521:192.168.1.7:1521 root@dc
Run Code Online (Sandbox Code Playgroud)

当然它可以工作(有时我也添加一些debug -vv来查看是否有任何东西通过).

现在困难的部分 - 连接到Oracle.我安装了instantclient 11.2.我的tnsnames.ora看起来像那样:

testdb =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = dbname)
    )
  )
Run Code Online (Sandbox Code Playgroud)

当我尝试使用命令连接时:

./sqlplus username/pass@testdb
Run Code Online (Sandbox Code Playgroud)

它开始通过隧道连接(我在ssh调试中看到它),但它失败告诉:

./sqlplus username/pass@testdb

SQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 13 20:46:07 2010

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:
ORA-12541: TNS:no listener


Enter user-name: 
Run Code Online (Sandbox Code Playgroud)

当我在内网上尝试执行相同的命令时,它可以工作(显然唯一的区别是在tnsnames.ora主机中我们有192.168.1.7而不是本地主机).

我也尝试使用简单的命令行:

./sqlplus username/pass@//localhost:1521/testdb
Run Code Online (Sandbox Code Playgroud)

或者

./sqlplus username/pass@//localhost:1521/testdb
Run Code Online (Sandbox Code Playgroud)

但没有任何帮助:)

我将不胜感激任何帮助或建议.我错过了一些ssh标志以使其成为可能吗?

可能是日志文件:

*********************************************************************** …
Run Code Online (Sandbox Code Playgroud)

oracle ssh sqlplus tunnel ora-12541

8
推荐指数
1
解决办法
2万
查看次数

启动Oracle SQL*Plus时出现TNS协议适配器错误

每当我尝试登录SQL*Plus(11g标准版Win 64)时,我都会收到与某些连接错误相关的错误.

我尝试以sysdba身份登录并提供密码.

所有服务都已启动.我在Windows 7上.

任何帮助,将不胜感激.

在此输入图像描述

oracle sqlplus oracle11g

8
推荐指数
3
解决办法
9万
查看次数

如何在Windows命令脚本中使用sql*plus来控制流量?

我正在尝试使用sql*plus来控制一个小的Windows命令脚本.

基本上,我想执行一些PL/SQL(可能从视图或表中选择或执行一个函数),它向我显示数据库中某些行的状态,然后根据行的状态执行一些Windows命令.

我的问题是如何将结果返回到命令脚本中.

sqlplus user/password@server @script.sql

IF <CONDITIONAL HERE BASED on script.sql results> GOTO :runprocess

REM log and email that process had to be skipped
EXIT

:runprocess
REM run various Windows service commands
Run Code Online (Sandbox Code Playgroud)

windows oracle sqlplus batch-file oracle10g

8
推荐指数
2
解决办法
8万
查看次数

为什么sqlplus没有连接?

我的目标是从OS X机器连接到Oracle 9i实例.我按照这里的设置说明进行了操作,没有错误(最终).但是,我发现sqlplus无法连接:

[ ethan@gir ~ ]$ sqlplus xxx/yyy@zzz

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Apr 17 10:13:08 2009

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
Run Code Online (Sandbox Code Playgroud)

Looooong等待......

ERROR:
ORA-12170: TNS:Connect timeout occurred

Enter user-name: xxx
Enter password: 
ERROR:
ORA-12162: TNS:net service name is incorrectly specified

Enter user-name:
Run Code Online (Sandbox Code Playgroud)

我的tnsnames.ora档案......

zzz =
  (DESCRIPTION = 
    (ADDRESS_LIST =
      (ADDRESS =
        (PROTOCOL = TCP)
        (HOST = dbhost)
        (PORT = 1521))
    )
  (CONNECT_DATA =
    (SERVICE_NAME = zzz)
  )
)
Run Code Online (Sandbox Code Playgroud)

也许有一个需要设置的env变量? …

oracle macos sqlplus ora-12170

7
推荐指数
1
解决办法
8万
查看次数

Linux下的SQL*Plus历史记录

如何在Linux中使用sqlplus来维护我的查询历史记录?这样我就可以使用向上/向下箭头来获取我之前的查询.

linux history sqlplus

7
推荐指数
1
解决办法
5127
查看次数

如何将序列中的下一个值转换为变量?

所以我正在编写一个存储过程,并且无法将序列的下一个值转换为变量.

序列名称传递给函数并存储为varchar2变量.如何将该序列中的下一个值转换为局部变量.

oracle sequences sqlplus

7
推荐指数
1
解决办法
2万
查看次数

PLSQL Procudure(Oracle)比较where子句中的变量

这真让我抓狂.我想对列和变量进行简单的比较,但它不起作用.以下行总是计算所有元组,而我只需要那些由where子句条件限制的元组.

 SELECT count(*) INTO cnt from class where class.fid = fid;
Run Code Online (Sandbox Code Playgroud)

它看起来很简单,但我已经在这个工作了几个小时.完整的sql proc是

令人困惑的是,如果我用一些硬编码ID(如105)替换fid,它会给出一个正确的答案),但是当我使用fid时它就不再起作用了,并返回所有类的计数.由于某种原因,总是class.fid = fid.当我使用>,<或<>时,返回0计数!

create or replace PROCEDURE pro_report2
AS
CURSOR c_dept IS select deptid, dname from department;
TYPE cur_typ IS REF CURSOR;
c1 cur_typ;
query_str1 VARCHAR2(200);
fid faculty.fid%type := 102;
fname faculty.fname%type;
cnt NUMBER;

BEGIN
    FOR dept_row in c_dept LOOP
        DBMS_OUTPUT.PUT_LINE('Dept.Name: ' || dept_row.dname);
        DBMS_OUTPUT.PUT_LINE('Faculty Name' || chr(9)|| chr(9) || '0 Class' || chr(9) || chr(9) || '1 Class' || chr(9) || chr(9) || '2 Classes' || …
Run Code Online (Sandbox Code Playgroud)

mysql sql database oracle sqlplus

7
推荐指数
1
解决办法
704
查看次数

带有Windows批处理文件的SQLPLUS命令行

我想创建一个批处理文件,它将打开SQLPLUS [CLI]并执行一些存储的sql文件,并将输出存储到文本文件中.

所以我创建了这个批处理文件[不起作用].
这些SQL文件包含SQL,它返回表中的最大数字.

sqlplus scott/tiger@DB
@sql1.sql>data1.txt
@sql2.sql>data2.txt
Run Code Online (Sandbox Code Playgroud)

问题是它在打开SQLPLUS后不执行SQL文件

  • Windows XP
  • Oracle 9i

sqlplus batch-file oracle9i

7
推荐指数
1
解决办法
8万
查看次数