plsql不能在sql select中使用变量

Posted

技术标签:

【中文标题】plsql不能在sql select中使用变量【英文标题】:plsql cannot use variables in sql select 【发布时间】:2017-12-04 13:53:19 【问题描述】:

最近几天我对 APEX 感到非常厌烦,我试图在 application express 中运行交互式报告,但似乎无法使用我在我的 sql 查询中声明的变量。下面是错误,我还包括了有效的代码。 get_longlat() 函数经过测试,它返回 SDO_GEOMETRY 数据类型。

ORA-06550:第 7 行,第 12 列:PLS-00306:错误的数量或类型 调用“||”的参数ORA-06550:第 7 行,第 1 列:PL/SQL: 语句被忽略

DECLARE
l_query VARCHAR2(4096);
l_location SDO_GEOMETRY := get_longlat(v('P2_POSTCODE'));
BEGIN

l_query := '
                SELECT
                "VENUE_ID",
                "VENUE_NAME",
                "CITY",
                "VENUE_NO",
                "POSTCODE",
                dbms_lob.getlength("THUMBNAIL") "THUMBNAIL",
                "DESCRIPTION",
                SDO_GEOM.SDO_DISTANCE(G_LOCATION, '  || l_location || ',0.005,''unit=mile'') "G_LOCATION"                
                FROM   "GAMEVENUE"
                WHERE (SDO_WITHIN_DISTANCE(G_LOCATION,' || l_location || ',''distance=250 unit=mile'') = ''TRUE'');';

RETURN l_query;

这行得通

l_query := '
                SELECT
                "VENUE_ID",
                "VENUE_NAME",
                "CITY",
                "VENUE_NO",
                "POSTCODE",
                dbms_lob.getlength("THUMBNAIL") "THUMBNAIL",
                "DESCRIPTION",
                SDO_GEOM.SDO_DISTANCE(G_LOCATION, MDSYS.SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(-4.1530439,50.371089,NULL),NULL,NULL),0.005,''unit=mile'') "G_LOCATION"                
                FROM   "GAMEVENUE"
                WHERE (SDO_WITHIN_DISTANCE(G_LOCATION,SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(-4.1530439,50.371089,null),null,null),''distance=250 unit=mile'') = ''TRUE'')';

【问题讨论】:

||仅适用于字符类型,或可以隐式转换为字符类型的类型。 ||运算符连接字符串和 CLOB 数据。 【参考方案1】:

因为SDO_GEOMETRY 不是charnumber(隐含地与char 相当)类型,所以不能在直接连接中使用它。 试试这个:

l_query := '
                SELECT
                "VENUE_ID",
                "VENUE_NAME",
                "CITY",
                "VENUE_NO",
                "POSTCODE",
                dbms_lob.getlength("THUMBNAIL") "THUMBNAIL",
                "DESCRIPTION",
                SDO_GEOM.SDO_DISTANCE(G_LOCATION, MDSYS.SDO_GEOMETRY('||l_sdo_gtype||','||l_sdo_srid||',MDSYS.SDO_POINT_TYPE('||l_longitude||','||l_latitude||',NULL),NULL,NULL),0.005,''unit=mile'') "G_LOCATION"                
                FROM   "GAMEVENUE"
                WHERE (SDO_WITHIN_DISTANCE(G_LOCATION,SDO_GEOMETRY('||l_sdo_gtype||','||l_sdo_srid||',SDO_POINT_TYPE('||l_longitude||','||l_latitude||',null),null,null),''distance=250 unit=mile'') = ''TRUE'')';

其中l_sdo_gtypel_sdo_sridl_longitudel_latitude 是类型号;

【讨论】:

解析返回的查询结果为“ORA-06550: line 10, column 78: ORA-00936: missing expression”。如果您认为您的查询在语法上是正确的,请选中下面的“使用通用列名”复选框以继续而不进行解析。

以上是关于plsql不能在sql select中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

pl sql developer应用问题

可以调试但不能检查或监视 Oracle 中巨大的 PlSql 包中的变量

PLSQL - 游标不能在动态 sql 中使用

为啥我不能在 plsql 的一个 sql 命令中使用 current of 并返回 into?

sql select语句作为动态plsql块的绑定变量

不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名