【问题标题】:plsql cannot use variables in sql selectplsql不能在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 数据。

标签: sql oracle plsql oracle-apex


【解决方案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”。如果您认为您的查询在语法上是正确的,请选中下面的“使用通用列名”复选框以继续而不进行解析。
猜你喜欢
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-31
相关资源
最近更新 更多