标签搜索

oracle查询语句在内部可以运行,但套入变量就不行问题

wehg489
2025-12-04 / 0 评论 / 6 阅读 / 正在检测是否收录...
$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”这个词单独在一行且顶格。

0

评论

博主关闭了当前页面的评论
歌曲封面
0:00