我有一个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) 您好我通过隧道从数据中心访问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) 每当我尝试登录SQL*Plus(11g标准版Win 64)时,我都会收到与某些连接错误相关的错误.
我尝试以sysdba身份登录并提供密码.
所有服务都已启动.我在Windows 7上.
任何帮助,将不胜感激.

我正在尝试使用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) 我的目标是从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变量? …
如何在Linux中使用sqlplus来维护我的查询历史记录?这样我就可以使用向上/向下箭头来获取我之前的查询.
所以我正在编写一个存储过程,并且无法将序列的下一个值转换为变量.
序列名称传递给函数并存储为varchar2变量.如何将该序列中的下一个值转换为局部变量.
这真让我抓狂.我想对列和变量进行简单的比较,但它不起作用.以下行总是计算所有元组,而我只需要那些由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) 我想创建一个批处理文件,它将打开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文件