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
不是char
或number
(隐含地与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_gtype
、l_sdo_srid
、l_longitude
、l_latitude
是类型号;
【讨论】:
解析返回的查询结果为“ORA-06550: line 10, column 78: ORA-00936: missing expression”。如果您认为您的查询在语法上是正确的,请选中下面的“使用通用列名”复选框以继续而不进行解析。以上是关于plsql不能在sql select中使用变量的主要内容,如果未能解决你的问题,请参考以下文章
可以调试但不能检查或监视 Oracle 中巨大的 PlSql 包中的变量