$sql = "
SELECT
i.SPECIFICATION,
i.MD_ID,
i.MD_NAME,
i.REVISIONID
FROM
PLM2024.ITEM_0 i
INNER JOIN (
SELECT
MD_ID,
MAX(REVISIONID) AS latest_revision
FROM
PLM2024.ITEM_0
WHERE
REGEXP_LIKE(MD_ID, '^(XC|XQ|QD|QB|QE|QF|QG|QH|QM|QN|QR|QY)')
GROUP BY
MD_ID
) latest
ON
i.MD_ID = latest.MD_ID
AND i.REVISIONID = latest.latest_revision
WHERE
REGEXP_LIKE(i.MD_ID, '^(XC|XQ|QD|QB|QE|QF|QG|QH|QM|QN|QR|QY)');
"; 里面的语句能在oracle里正常运行,但是套入$sql里就查不了了
解决办法
$sql = <<<SQL
SELECT
i.SPECIFICATION,
i.MD_ID,
i.MD_NAME,
i.REVISIONID
FROM
PLM2024.ITEM_0 i
INNER JOIN (
SELECT
MD_ID,
MAX(REVISIONID) AS latest_revision
FROM
PLM2024.ITEM_0
WHERE
REGEXP_LIKE(MD_ID, '^(XC|XQ|QD|QB|QE|QF|QG|QH|QM|QN|QR|QY)')
GROUP BY
MD_ID
) latest
ON
i.MD_ID = latest.MD_ID
AND i.REVISIONID = latest.latest_revision
WHERE
REGEXP_LIKE(i.MD_ID, '^(XC|XQ|QD|QB|QE|QF|QG|QH|QM|QN|QR|QY)')
SQL;这个问题通常是由于 SQL语句中的换行符和引号处理 导致的。在PHP中直接将多行SQL字符串赋值给变量时,需要注意以下几点:
问题分析
换行符问题:PHP中的多行字符串会包含实际换行符
引号转义:SQL语句中的引号可能需要转义
SQLPlus与PHP环境差异:在SQLPlus中能运行不代表在PHP中也能直接运行
HEREDOC语法详解
什么是HEREDOC?
HEREDOC(Here Document)是PHP中一种定义多行字符串的语法结构,特别适合处理包含大量文本、HTML或SQL代码的情况。
$string = <<<标识符
多行文本内容
标识符;
HEREDOC的特点
1. 保留所有格式
$sql = <<<SQL
SELECT *
FROM users
WHERE
status = 'active'
AND created_at > '2024-01-01'
ORDER BY id DESC
SQL;
// SQL字符串会完全保留换行和缩进
2. 变量解析
HEREDOC中会解析变量(类似于双引号字符串):
$name = "张三";
$age = 25;
$text = <<<TEXT
姓名:$name
年龄:$age
职业:程序员
TEXT;
echo $text;
/*
输出:
姓名:张三
年龄:25
职业:程序员
*/
3. 支持复杂表达式
$user = ['name' => '李四', 'age' => 30];
$text = <<<TEXT
用户信息:
姓名:{$user['name']}
年龄:{$user['age']}
TEXT;
使用规则和注意事项
重要规则:
标识符命名:自定义,通常使用大写字母(如SQL、EOD、HTML等)
结束标识符:
必须单独一行
必须顶格写(不能有缩进)
后面只能有分号,不能有其他字符
在PHP中,HEREDOC语法中的标识符(如SQL、EOD、HTML)是自定义的,没有预定义的标准格式。你可以使用任何有效的标签名称,但通常使用大写字母以增强可读性,并且要与内容有所区分。
重要规则:
标识符由字母、数字和下划线组成,且必须以字母或下划线开头。
开始标识符(<<<之后)和结束标识符必须相同,结束标识符必须顶格写,且后面只能有分号(不能有任何其他字符,包括空格)。
开始标识符可以用双引号括起来,也可以不用(但通常不用)。如果用双引号,则与不用一样,都是HEREDOC;如果用单引号,则变成Nowdoc,不解析变量。
示例:
$str = <<<EOD
示例文本
EOD;
$str = <<<'EOD'
示例文本(不解析变量)
EOD;
注意:在PHP 7.3.0之前,结束标识符必须从行的第一列开始,并且后面只能有一个分号(或没有分号,但必须是行结束)。从PHP 7.3.0开始,结束标识符可以缩进,但缩进部分会被从每行文本中去除(称为“缩进终止”)。
因此,在编写HEREDOC时,选择标识符要避免与内容中的字符串冲突。例如,如果你在写SQL,使用“SQL”作为标识符很直观,但要确保在内容中不会出现“SQL”这个词单独在一行且顶格。
评论