MySQL5.7编写存储过程报错'as在此位置无效,期望;'问题求助
报错根因定位
你遇到的as is not valid in this position expecting ';'报错的直接诱因是最外层SELECT查询存在语法错误:
- 你给整段返回结果的SELECT查询额外套了一层括号,还在括号末尾追加了
as ca的别名定义。这种写法仅适用于该查询作为子查询嵌套在其他外层查询中的场景,直接在存储过程中作为返回结果的独立查询,不允许在整体外层括号后追加别名,删掉最外层的括号和末尾的as ca即可解决当前报错。
其他需要修正的语法问题
你的代码中还存在几处会导致后续运行异常的问题:
- 所有形如
:startDateTime的占位符被单引号包裹后,会被MySQL识别为固定字符串,不会作为动态参数解析。如果是存储过程的入参,直接写参数名即可,不需要加单引号;如果是要构造动态SQL,需要配合PREPARE、EXECUTE语法执行。 coalesce(':stageCode')写法不符合函数要求,coalesce函数至少需要传入2个参数,作用是返回第一个非空的参数,此处如果是要判断参数是否为空,直接写:stageCode is null即可。stage_code in (':stageCode')写法存在逻辑问题,参数被单引号包裹后,即使传入逗号分隔的多个枚举值,也会被识别为单个字符串,无法匹配多值场景。
修正后的完整代码
DROP PROCEDURE IF EXISTS load_content; DELIMITER $$ -- 若需要传入参数,可在括号内定义,示例:CREATE PROCEDURE load_content(IN p_startDateTime DATETIME, IN p_endDateTime DATETIME) CREATE PROCEDURE load_content() BEGIN SELECT DISTINCT ca.id AS id, cp.provider_id AS cpId, ca.license_start_date AS startDateTime, ca.license_end_date AS endDateTime, ca.content_group_id AS contentGroupId, ca.episode AS episode, ca.series_id AS seriesId, ca.is_episode AS isEpisode, aw.stage_code AS stageCode, tal.title AS title, tal.synopsis AS synopsis, ta.content_type AS contentType FROM (SELECT * FROM content_asset WHERE (:startDateTime is null OR license_start_date <= :startDateTime) AND (:endDateTime is null OR license_end_date >= :endDateTime) AND (:id is null OR id = :id) AND (:isEpisode is null OR is_episode = :isEpisode)) as ca INNER JOIN title_asset ta ON ca.title_asset_id = ta.id INNER JOIN (select * from title_asset_localized WHERE (:title is null OR title like CONCAT('%', :title, '%')) AND language = :language) tal ON ta.id = tal.title_asset_id INNER JOIN (select * from content_provider WHERE (:cpId is null OR provider_id like CONCAT('%', :cpId, '%' ) )) cp ON cp.idx = ca.provider_id INNER JOIN (select * from asset_workflow WHERE asset_type = :contentManagementType AND (:stageCode is null OR stage_code in (:stageCode))) as aw ON aw.asset_id = ca.id; END $$ DELIMITER ;
内容的提问来源于stack exchange,提问作者Clara
相关产品推荐
相关产品推荐

