执行 oracle 更改查询时出现错误:ORA-01756:引用的字符串未正确终止

Posted

技术标签:

【中文标题】执行 oracle 更改查询时出现错误:ORA-01756:引用的字符串未正确终止【英文标题】:While executing oracle alter query getting error : ORA-01756: quoted string not properly terminated 【发布时间】:2021-07-13 13:19:51 【问题描述】:

我正在尝试在我的 .sql 文件中执行以下查询并收到错误:

引用的字符串没有正确终止

execute immediate 'alter tablespace '||tname||' add datafile '''||file_name||lname||ext||''' size '||add_space||'m autoextend off maxsize 30720m';

新代码:

set serveroutput on;
set linesize 200
set head off;
set feedback off;
DECLARE
chr integer(12);
tname varchar (50):='$​​​i​​​';  # Value I am getting from linux
file_name varchar (500);
add_space integer(10):=$​​​fiftin_per​​​;
m_point varchar(200):=$mount_name;
var varchar(10):='/';
stamp varchar(50):='$random_val';
ext varchar:='.dbf'

BEGIN

file_name:=m_point||var||tname||stamp||ext;

dbms_output.put_line(file_name);  

#op : \oradata\data\test14_7_2021.dbf

dbms_output.put_line('alter tablespace '||tname||' add datafile '||file_name||' size '||add_space||'m autoextend off'); 

#op : alter tablespace test add datafile \oradata\data\test14_7_2021.dbf size 302m autoextend off

dbms_output.put_line('alter tablespace '||tname||' add datafile "'||file_name||'" size '||add_space||'m autoextend off');

#op :alter tablespace test add " datafile \oradata\data\test14_7_2021.dbf" size 302m autoextend off

dbms_output.put_line('alter tablespace '||tname||' add datafile '''||file_name||''' size '||add_space||'m autoextend off');

#op :alter tablespace test add datafile ' \oradata\data\test14_7_2021.dbf' size 302m autoextend off


END;
/

我尝试了三种不同的方式来打印该命令并给出了文件的输出,请提出建议。

【问题讨论】:

可以使用dbms_output调试生成的语句。但是,该行不会引发该错误,除非您以某种方式将单引号嵌入到您用来构造它的变量之一中;或者如果(因为它没有分号)以下行继续命令并且有一些额外/缺失的东西。该语句无效,因为您不能将maxsize 设置为autoextend off,而是that isn't the error that generates。 您的变量中是否有单引号? @AlexPoole :我已经按照您的建议使用 dbms_output 解决了这个问题,但现在问题是我将文件名从 linux 传递到 oracle 查询,该查询在文件名之前占用一个空格,并且在运行查询时我我收到无效的文件名错误。我试图传递不带引号的文件名,它工作正常,但带引号它不起作用。请参阅我的第二条评论中的以下示例: @AlexPoole : 1. 不带引号 : dbms_output.put_line( 'alter tablespace '||tname||' add datafile '||file_name||' size '||add_space||'m autoextend off'); OP : alter tablespace SYSAUX add datafile /oradata01/POCDB/data/SYSAUX112917893.dbf size 136m autoextend off 2. 不带引号 : dbms_output.put_line( 'alter tablespace '||tname||' add datafile '''||file_name||''' size '||add_space||'m autoextend off'); OP : alter tablespace SYSAUX add datafile ' oradata01/POCDB/data/SYSAUX112917893.dbf' size 136m autoextend off #它在第一个引号后添加一个空格,这是不需要的。 @Jameson_uk :是的,我声明了一个变量来打印单引号,删除后问题已解决,但现在又遇到了另一个问题。 【参考方案1】:

我已使用以下代码解决了我的问题:我在 linux 中修剪了文件名,然后将该值传递给 oracle:

var='/'
random_val=`date +"%d_%m_%y"_"%H"_"%M"_"%S"`
ex=".dbf";
fname="$mount_name$var$i$random_val$ex"
ac=`echo -e "$fname" | tr -d '[:space:]'`   # Trimmed filename
echo $ac
output3=`sqlplus -s usr/usr as sysbackup <<END2
set serveroutput on;
set linesize 200
set head off;
set feedback off;
DECLARE
tname varchar (50):='$i';
file_name varchar (500):='$ac';
add_space integer(10):=$fiftin_per;

BEGIN
dbms_output.put_line('alter tablespace '||tname||' add datafile '''||file_name||''' size '||add_space||'m autoextend off');
#op: alter tablespace test add datafile /oradata1/data/test12345.dbf size 1208m autoextend off;

dbms_output.put_line('We have added :'||file_name);
#op: We have added/oradata1/data/test12345.dbf 
END;
/
exit;
END2`

【讨论】:

以上是关于执行 oracle 更改查询时出现错误:ORA-01756:引用的字符串未正确终止的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE PL/SQL 在查询 3 列信息时出现存储过程错误

Symfony 5 执行 AJAX 查询时出现错误 500

使用 EclipseLink 在 Oracle 上执行查询时出现奇怪的行为

使用 `getclobval()` 执行 oracle 程序时出现“无效字符错误”

查询 oracle 多维数据集时出现 java.sql.SqlRecoverableException

在oracle中执行alter存储过程时出现无效表名错误