简体   繁体   English

在 C++ 中带有子句和函数的 oracle 的 OTL 问题

[英]OTL problem with oracle with clause and function in it in C++

I am using Oracle 18C(我正在使用 Oracle 18C(

SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jan 28 02:44:17 2020
Version 18.8.0.0.0

) I found this strange issue when I tried to use OTL in C++ I have a query which uses "with" clause of oracle like below: ) 当我尝试在 C++ 中使用 OTL 时,我发现了这个奇怪的问题我有一个使用 oracle 的“with”子句的查询,如下所示:

with 
FUNCTION
SELECT QUERY with one bind variable

When I execute this "with cluase" query in plsql developer, it executes smoothly.当我在 plsql developer 中执行这个“with cluase”查询时,它执行顺利。 But when I put the same query in otl_stream and with a bind variable: It throws me an error:但是当我在 otl_stream 和绑定变量中放入相同的查询时:它抛出一个错误:

ORA-00600: internal error code, arguments: [15216], [], [], [], [], [], [], [], [], [], [], []

For demostration purpose I created some temp table and written a query:出于演示目的,我创建了一些临时表并编写了一个查询:

create table test_with_func
(
int_col NUMBER(9),
varchar_col varchar2(30)
);
insert into test_with_func (INT_COL, VARCHAR_COL)
values (1, 'One');
insert into test_with_func (INT_COL, VARCHAR_COL)
values (2, 'Two');
commit;
with 
function getvalue(in_varchar in varchar2) return integer is out_int NUMBER;
begin
  select int_col
    into out_int
    from test_with_func
   where varchar_col = in_varchar;
  return out_int;
end;
select varchar_col from test_with_func where int_col = getvalue('Two')

When I put it in c++ code, I get the weird error mentioned above.当我把它放在 C++ 代码中时,我得到了上面提到的奇怪的错误。 Below is my C++ code.下面是我的 C++ 代码。

#include<iostream>
#if defined(solaris32)
#define OTL_ORA9I
#else
#define OTL_ORA12C
#define OTL_UBIGINT unsigned long long
#endif //#if defined(solaris32)
#define OTL_STL // Enable STL compatibily mode
// Now we include OTL
#include <otlv4.h>

otl_connect db; // connect object
using namespace std;

int main(int argc,char **argv)
{
 try{
  db.rlogon("user/password@dbalias"); // connect to Oracle
 }

 catch(otl_exception& p){ // intercept OTL exceptions
  cerr<<p.msg<<endl; // print out error message
  cerr<<p.stm_text<<endl; // print out SQL that caused the error
  cerr<<p.var_info<<endl; // print out the variable that caused the error
 }

 cout<<"Connected to DB"<<endl;
   int mindom=1;
   int maxdom=9999999;
   int minrhash=1;
   int maxrhash=9999999;                                           
 string getDateQuery = " with function getvalue(in_varchar in varchar2) return integer is out_int NUMBER;     \
                         begin                                                                                \
                           select int_col                                                                     \
                             into out_int                                                                     \
                             from test_with_func                                                              \
                            where varchar_col = in_varchar;                                                   \
                           return out_int;                                                                    \
                         end;                                                                                 \
                         select varchar_col                                                                   \
                         from test_with_func                                                                  \
                         where int_col = getvalue(:inputvarchar<char[30]>)";
 string Value;
 otl_stream *getDateStream;
try{
     string var="Two";
     getDateStream=new otl_stream(1, getDateQuery.c_str(), db);
     *getDateStream << var;

     while(!getDateStream->eof())
     {

      *(getDateStream) >> Value;

     }

   }
   catch(otl_exception &p)
   {
       cerr<<p.msg<<endl; // print out error message
       cerr<<p.stm_text<<endl; // print out SQL that caused the error
       cerr<<p.var_info<<endl; // print out the variable that caused the error
   }

  cout<<"Value is "<<Value<<endl;
  db.logoff(); // disconnect from Oracle

return 0;
}

Below is the output下面是输出

]$ ./a.out
Connected to DB
ORA-00600: internal error code, arguments: [15216], [], [], [], [], [], [], [], [], [], [], []

 with function getvalue(in_varchar in varchar2) return integer is out_int NUMBER;                              begin                                                                                                           select int_col                                                                                                  into out_int                                                                                                  from test_with_func                                                                                          where varchar_col = in_varchar;                                                                              return out_int;                                                                                             end;                                                                                                          select varchar_col                                                                                            from test_with_func                                                                                           where int_col = getvalue(:inputvarchar          )

Value is

Is this related to some preprocessor macro that I have missed?这与我错过的一些预处理器宏有关吗? Could anyone please help here.任何人都可以在这里帮忙。

After Changing the query from更改查询后

with 
function getvalue(in_varchar in varchar2) return integer is out_int NUMBER;
begin
  select int_col
    into out_int
    from test_with_func
   where varchar_col = in_varchar;
  return out_int;
end;
select varchar_col from test_with_func where int_col = getvalue('Two')

to

with 
function getvalue(in_varchar in varchar2) return integer is out_int NUMBER;
begin
  select int_col
    into out_int
    from test_with_func
   where varchar_col = in_varchar;
  return out_int;
end;
output as(
select varchar_col from test_with_func where int_col = getvalue('Two')
)
select * from output

Issue is resolved in C++ using OTL.问题已在 C++ 中使用 OTL 解决。 Change here is moved the last query of with clause into a sub query and added and new final select query.这里的变化是将 with 子句的最后一个查询移动到子查询中,并添加了新的最终选择查询。 But please note that both the queries work through plsql developer.但请注意,这两个查询都通过 plsql developer 工作。 Not sure why the first query is not working through OTL in C++.不知道为什么第一个查询不能通过 C++ 中的 OTL 工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM