我正在尝试更新 Oracle 中的一个包,来自 SQL Server 这一直令人困惑。
我编写了一个批处理文件,它首先运行.spec文件,然后运行.body文件,但即使手动运行它也不起作用。
我使用这个语法:
sqlplus username/password@databasename @c:\temp\myfile.spec
sqlplus username/password@databasename @c:\temp\myfile.body
Run Code Online (Sandbox Code Playgroud)
当我回到 Sql Developer 时,我可以查看包中的存储过程,发现它们尚未更新。
为什么我的软件包没有更新?
在开发过程中,我发现数据库有大量活动连接:
SELECT username, COUNT(*) FROM v$session GROUP BY username;
Run Code Online (Sandbox Code Playgroud)
为了找到真正保持连接的人,我想获取 IP 地址列表。
在一般网络搜索和阅读官方文档期间,我构建查询:
SELECT username, seconds_in_wait, machine, port, terminal, program, module, service_name
FROM v$session
WHERE type = 'USER';
Run Code Online (Sandbox Code Playgroud)
其中machine最重要的部分是select. 但不幸的是,machine字段显示客户端操作系统已知的主机名。
互联网上充斥着使用UTL_INADDR.GET_HOST_ADDRESS 的建议,但这不适用于我的情况。首先是因为ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝,其次是因为客户端操作系统主机名通常在/etc/hostname中定义,并且不可用于我们 Intranet 中的 DNS 服务器...
任何其他方式检索 Oracle DB 的打开会话的 IP(数据库实例在任何情况下都保存有关其套接字的信息...)。
更新
我在受信任的 Intranet 下,但网络层次结构未知。
我尝试查找哪些应用程序使用我的表(几个应用程序服务器,我不知道所有这些)。其中一些过度使用连接,需要修复。但首先应该确定它们...
我NLS_LANG在注册表中设置了我的本地语言。CMD 无法显示我当地语言的字符,所以我看到了 jibrish。我说的是来自客户端的提示而不是实际数据,例如错误消息。
SQL> conn scott/tiger
???ß°.
Run Code Online (Sandbox Code Playgroud)
我需要将客户端的设置保留在本地 NLS 中,因为其他程序依赖于它。
我已经尝试添加$set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252glogin,但显然它不起作用,因为脚本仅在 sql*Plus 已经启动后执行。
我的问题是,有没有什么方法NLS_LANG可以AMERICAN_AMERICA.WE8MSWIN1252 只为 SQL*Plus设置to ?
请问这里出了什么问题?
RETVAL=`sqlplus -s user/pass@DB <<EOF
SET TRIMSPOOL ON PAGESIZE 0 COLSEP , FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT process_id, source, destination, type FROM table WHERE process_id IN ('123','456');
EXIT;
EOF`
if [ -z "$RETVAL" ]; then
echo "No rows returned from database"
exit 0
else
echo $RETVAL
fi
Run Code Online (Sandbox Code Playgroud)
输出是:
123,a c,2 456,a c,5
Run Code Online (Sandbox Code Playgroud)
并且应该是:
123, a, c, 2
456, a, c, 5
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Emacs 中使用 sqlplus。效果很好。但我不知道一旦启动 sqlplus 会话,如何断开与数据库的连接。
我正在使用 sqlplus 模式:http://www.emacswiki.org/emacs/SqlPlusMode
我有密码中的特殊字符问题 - '@'。我不知道如何将带有这个特殊字符的密码传递给脚本文件并使用 sqlplus 连接的问题。
例如,我有用户“test_user”,密码为“temp123@”。对于通过 sqlplus 登录,我使用以下字符串进行转义:sqlplus test_user/\"temp123@\"@some-db:1521/SID
它运作良好。对于我的情况,我需要将密码作为 sql 脚本的参数传递。例如,我有以下脚本进行连接(实际上是使用几对登录名/密码来一次更新多个用户的脚本):
-- @deploy.sql
connect &&2./&&3.@&&1.
Run Code Online (Sandbox Code Playgroud)
失败是因为 sqlplus 无法正确解释带有“@”的密码。我尝试了许多来自谷歌的转义建议,但其中大部分适用于 sqlplus 调用时的连接字符串。对于我的情况,它需要传递给脚本的参数。
我有以下功能:
#!/bin/bash
get_instance{
dbname=$(sqlplus -s / as sysdba<<EOF
set pages 0
set feedback off
select name from v\$database;
exit;
EOF)
echo $dbname
}
get_instance
Run Code Online (Sandbox Code Playgroud)
它似乎工作。在错误消息的中间,我得到了我的dbname,但仍然返回一个语法错误。
oracle@testdb01:db01:/home/oracle/
> ./test.sh
./test.sh: line 3: get_instance{: command not found
DB01
./test.sh: line 11: syntax error near unexpected token `}'
./test.sh: line 11: `}'
Run Code Online (Sandbox Code Playgroud)
如果我完全删除函数调用,我会得到没有错误的结果:
dbname=$(sqlplus -s / as sysdba<<EOF
set pages 0
set feedback off
select name from v\$database;
exit;
EOF)
echo $dbname
oracle@testdb01:db01:/home/oracle
> ./test.sh
DB01
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能让它在函数中工作?
以下建议在 EOF 标签后放置括号并添加 …
对 shell 脚本有点陌生,想知道在 shell 脚本中 -s 选项 [sqlplus -s] 的使用。
提前致谢。
我正在尝试在 Oracle 数据库 docker 容器(for Windows 10)中使用 sqlplus 。
给出的命令:
"docker run -d -p 8080:8080 -p 1521:1521 --name OracleDB store/oracle/database/enterprise:12.2.0.1"
"docker start OracleDB"
"docker exec -it OracleDB bash"
"sqlplus / as sysdba"
Run Code Online (Sandbox Code Playgroud)
现在我收到错误消息:
Run Code Online (Sandbox Code Playgroud)"bash: sqlplus: command not found"


我正在开发一个解决方案,其中多个 SQL 和 PL/SQL 脚本通过 SQL*Plus 以批处理方式一起运行。
我在脚本中的相关点声明SET ECHO OFF;和SET ECHO ON;以输出相关代码。
目前输出看起来像这样:
SQL> DECLARE
2 ct number := 0;
3 ctChanges number := 0;
4
5 BEGIN
6 select count(*) into ct from ...
7 (...rest of code block...)
"some specific status message"
Commit executed.
Run Code Online (Sandbox Code Playgroud)
我们将此输出作为运行日志保存在我们的构建环境中,但也可以作为纯文本文件访问它。
然而,这种格式的一个缺点是,如果我想复制代码的某个部分并在 IDE(如 Toad 或 SQL Developer)中再次运行它,则很难排除行号。
是否可以告诉 SQL*Plus 输出上述代码,但不包括行号?