Ошибка хранимой процедуры в снежинке 'Недопустимый тип данных [VARCHAR (5)] для предиката [?]' - PullRequest
0 голосов
/ 09 января 2020

Я выполняю эту хранимую процедуру на Snowflake, но получаю эту ошибку "" Ошибка выполнения в процедуре хранения READ_RESULT_SET: SQL Ошибка компиляции: неверный тип данных [VARCHAR (5)] для предиката [?] В Statement.execute , строка 12, позиция 19 ""

Информация о таблицах: Table1.header = [Сегмент, условие], Table1.column1 = [aaa, bbb, ccc, ddd], Table1.column2 = [A = 1 , B = 1, C = 1, D = 1]

Table2.header = [A, B, C, D], Table2.column1 = [1,0,0,0], Table2 .column2 = [1,0,1,0], Table2.column3 = [0,0,0,0], Table2.column4 = [0,1,0,0]

Я пытаюсь получить column2 из таблицы Table1 и запустить их как мое условие во втором запросе. если я скопирую те же условия и добавлю их вручную в запрос, он отлично работает.

create or replace procedure read_result_set()
returns float not null
language javascript
as     
$$  
var my_sql_command = "select * from TABLE1";
var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
var result_set1 = statement1.execute();
// Loop through the results, processing one row at a time... 
var result = 0
while (result_set1.next())  {
    var condition = result_set1.getColumnValue(2);

    stmt = snowflake.createStatement( { sqlText: "select * from TABLE2 where ?;",binds:[condition] } );   ###THE PROBLEM IS IN THIS LINE
    //stmt = snowflake.createStatement( { sqlText: "select * from TABLE2 where A = 1;" } );   ####If I try this line instead, it works perfect
    res = stmt.execute();

    while (res.next())  {
      var one = res.getColumnValue(1);
      var two = res.getColumnValue(2);
      var three = res.getColumnValue(3);
      var four = res.getColumnValue(4);
      stmt2 = snowflake.createStatement( { sqlText: "INSERT INTO RESULT  VALUES (?, ?, ?, ?);", binds:[one, two, three, four, one] } );
      res2 = stmt2.execute();
      }
    //res.next();
    //returned_value = res.getColumnValue(1);
   }
 return 0.0; // Replace with something more useful.
 $$
 ;

 call READ_RESULT_SET()

1 Ответ

2 голосов
/ 09 января 2020

Ваша привязка задается не как выражение, а как строка.

Вы ожидаете WHERE A = 1
Что вы получаете WHERE 'A = 1'

Вы можете попробуйте использовать конкатенацию вместо привязки, изменив данные в таблице 1 или проанализировав только значение из столбца 2, используя функцию сопоставления с подстрокой или регулярным выражением.

...