Oracle PL/SQL - 如何转义冒号 (:),在 Connect 中被误解为绑定变量
Oracle PL/SQL - How to escape colon (:), being misinterpreted for bind variable in Connect
我正在尝试在我的 PL/SQL-Scripts 之一中使用来自 Oracle 的 CONNECT 命令。
我想要实现的是能够切换到脚本本身内部的不同上下文(例如,以用户身份登录,然后在某个时候切换到 sys dba)。
我目前的做法如下:
sqlplus user/password@//数据库:1521/orcl @complete.sql
complete.sql
的内容
DECLARE
-- declare
v_scriptInserted varchar2(1);
v_booleanFalse varchar2(1) := '0';
BEGIN
SELECT CASE WHEN COUNT(*) >= 1 THEN 1 ELSE 0 END INTO v_scriptInserted FROM SCHEMA_HISTORY WHERE SCRIPT = '&v_SCRIPTNAME';
IF v_scriptInserted = booleanFalse THEN
-- do Stuff with user privilidges and after this is done switch to sysdba
CONNECT sys/oracle@database:1521/orcl AS SYSDBA
-- do magic here with sysdba
-- SWITCH CONTEXT BACK TO User
DISCONNECT;
END IF;
END;
/
但是,无论我如何尝试转义 CONNECT 序列,部分 :1521 都会被误解为 bind varibale (SP2-0552)。
我已经深入研究了堆栈溢出并找到了相关文章:
- How to escape ":" in Oracle dynamic SQL and also have bind variables?
- Oracle PL/SQL - How to escape colon (:), being misinterpreted for bind variable
然而无论我尝试什么似乎都不起作用。
我目前的做法是:
CONNECT sys/oracle@database:1521/orcl AS SYSDBA
CONNECT sys/oracle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=database)(PORT=1521))(CONNECT_DATA=(SID=orcl)) AS SYSDBA
CONNECT sys/oracle@database\:1521/orcl AS SYSDBA
SELECT 'sys/oracle@database' || ':' || '1521/orcl AS SYSDBA' INTO v_dest_connstring FROM DUAL;
CONNECT 'v_dest_connstring'
CONNECT 'sys/oracle@database:1521/orcl AS SYSDBA'
CONNECT ''sys/oracle@database:1521/orcl AS SYSDBA''
CONNECT '''sys/oracle@database:1521/orcl AS SYSDBA'''
CONNECT "sys/oracle@database:1521/orcl AS SYSDBA"
CONNECT ""sys/oracle@database:1521/orcl AS SYSDBA""
CONNECT """sys/oracle@database:1521/orcl AS SYSDBA"""
非常感谢任何帮助。
谢谢,
============================================= =
编辑:
1) CONNECT sys/oracle@"database:1521/orcl"
的想法
1.1) 与“
`CONNECT sys/oracle@"database:1521/orcl" AS SYSDBA
*
FEHLER in Zeile 16:
ORA-06550: Zeile 16, Spalte 5:
PLS-00103: Encountered the symbol "CONNECT"`
1.2) 与 '
相同
CONNECT sys/oracle@'database:1521/orcl' AS SYSDBA
*
FEHLER in Zeile 17:
ORA-06550: Zeile 17, Spalte 5:
PLS-00103: Encountered the symbol "CONNECT" when expecting one of the
following
2) 将端口保留为可选端口,因为 1521 是默认端口:
CONNECT sys/oracle@database/orcl AS SYSDBA
*
FEHLER in Zeile 17:
ORA-06550: Zeile 17, Spalte 5:
PLS-00103: Encountered the symbol "CONNECT" when expecting one of the
following
3) 错过最后一个括号 @(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=database)(PORT=1521))(CONNE CT_DATA=(SID=orcl) )) 作为 SYSDBA
CONNECT sys/oracle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=database)(PORT=1521))(CONNECT_DATA=(SID=orcl))) AS SYSDBA
*
FEHLER in Zeile 17:
ORA-06550: Zeile 17, Spalte 5:
PLS-00103: Encountered the symbol "CONNECT" when expecting one of the
following
CONNECT
是一个SQLPLUS命令,不可能在pl\sql块中使用。您必须将其从块中取出并单独放入 sqlplus 脚本文件中(如果需要)。
我正在尝试在我的 PL/SQL-Scripts 之一中使用来自 Oracle 的 CONNECT 命令。 我想要实现的是能够切换到脚本本身内部的不同上下文(例如,以用户身份登录,然后在某个时候切换到 sys dba)。
我目前的做法如下:
sqlplus user/password@//数据库:1521/orcl @complete.sql
complete.sql
的内容DECLARE
-- declare
v_scriptInserted varchar2(1);
v_booleanFalse varchar2(1) := '0';
BEGIN
SELECT CASE WHEN COUNT(*) >= 1 THEN 1 ELSE 0 END INTO v_scriptInserted FROM SCHEMA_HISTORY WHERE SCRIPT = '&v_SCRIPTNAME';
IF v_scriptInserted = booleanFalse THEN
-- do Stuff with user privilidges and after this is done switch to sysdba
CONNECT sys/oracle@database:1521/orcl AS SYSDBA
-- do magic here with sysdba
-- SWITCH CONTEXT BACK TO User
DISCONNECT;
END IF;
END;
/
但是,无论我如何尝试转义 CONNECT 序列,部分 :1521 都会被误解为 bind varibale (SP2-0552)。
我已经深入研究了堆栈溢出并找到了相关文章: - How to escape ":" in Oracle dynamic SQL and also have bind variables? - Oracle PL/SQL - How to escape colon (:), being misinterpreted for bind variable 然而无论我尝试什么似乎都不起作用。
我目前的做法是:
CONNECT sys/oracle@database:1521/orcl AS SYSDBA
CONNECT sys/oracle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=database)(PORT=1521))(CONNECT_DATA=(SID=orcl)) AS SYSDBA
CONNECT sys/oracle@database\:1521/orcl AS SYSDBA
SELECT 'sys/oracle@database' || ':' || '1521/orcl AS SYSDBA' INTO v_dest_connstring FROM DUAL; CONNECT 'v_dest_connstring'
CONNECT 'sys/oracle@database:1521/orcl AS SYSDBA'
CONNECT ''sys/oracle@database:1521/orcl AS SYSDBA''
CONNECT '''sys/oracle@database:1521/orcl AS SYSDBA'''
CONNECT "sys/oracle@database:1521/orcl AS SYSDBA"
CONNECT ""sys/oracle@database:1521/orcl AS SYSDBA""
CONNECT """sys/oracle@database:1521/orcl AS SYSDBA"""
非常感谢任何帮助。
谢谢,
============================================= =
编辑:
1) CONNECT sys/oracle@"database:1521/orcl"
1.1) 与“
`CONNECT sys/oracle@"database:1521/orcl" AS SYSDBA
*
FEHLER in Zeile 16:
ORA-06550: Zeile 16, Spalte 5:
PLS-00103: Encountered the symbol "CONNECT"`
1.2) 与 '
相同CONNECT sys/oracle@'database:1521/orcl' AS SYSDBA
*
FEHLER in Zeile 17:
ORA-06550: Zeile 17, Spalte 5:
PLS-00103: Encountered the symbol "CONNECT" when expecting one of the
following
2) 将端口保留为可选端口,因为 1521 是默认端口:
CONNECT sys/oracle@database/orcl AS SYSDBA
*
FEHLER in Zeile 17:
ORA-06550: Zeile 17, Spalte 5:
PLS-00103: Encountered the symbol "CONNECT" when expecting one of the
following
3) 错过最后一个括号 @(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=database)(PORT=1521))(CONNE CT_DATA=(SID=orcl) )) 作为 SYSDBA
CONNECT sys/oracle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=database)(PORT=1521))(CONNECT_DATA=(SID=orcl))) AS SYSDBA
*
FEHLER in Zeile 17:
ORA-06550: Zeile 17, Spalte 5:
PLS-00103: Encountered the symbol "CONNECT" when expecting one of the
following
CONNECT
是一个SQLPLUS命令,不可能在pl\sql块中使用。您必须将其从块中取出并单独放入 sqlplus 脚本文件中(如果需要)。