Почему я получаю эту ошибку при выполнении функции Postgres

String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

Убедитесь, что вы понимаете, почему. Это потому, что сравнение == сравнивает только ссылки; equals() метод сопоставляет содержимое по символу.

Когда вы вызываете new для a и b, каждый получает новую ссылку, указывающую на "foo" в таблице строк. Ссылки разные, но контент один и тот же.

-1
задан a_horse_with_no_name 25 February 2019 в 07:35
поделиться

1 ответ

Вы неправильно получаете значения в переменные. Чтобы сохранить значение результата запроса в переменной (или двух), вам нужно использовать select .. into variable ...

CREATE OR REPLACE FUNCTION public.flowrate7()
    RETURNS TABLE(oms_id integer, flowrate numeric, chakno character varying) 
    LANGUAGE plpgsql 
AS $BODY$

declare 
  temp_omsId integer;
  temp_flowrate numeric(20,3);
  temp_chakno varchar(100);
begin

  DROP TABLE IF EXISTS tbl_oms;
  DROP TABLE IF EXISTS tbl_calFlow;

  CREATE temporary TABLE tbl_oms(omsid__ integer) ON COMMIT DELETE ROWS;
  CREATE temporary TABLE tbl_calFlow(OmsId_ integer,FlowRate_ numeric(20,3),ChakNo_ varchar(100)) ON COMMIT DELETE ROWS;

  insert into tbl_oms 
  select OmsId 
  from MstOms;

  while (select count(*) from tbl_oms) <> 0 LOOP

    select omsid__  
       into temp_omsId   --<< here
    from tbl_oms LIMIT 1;

    select case when inletpressure> 0.5 then 1 else 0 end, chakno 
      into temp_flowrate, temp_chakno --<< here
    from MstOms 
    where omsid = temp_omsId;

    insert into tbl_calFlow values (temp_omsId,temp_flowrate,temp_chakno);
    delete from tbl_oms where omsid__ = temp_omsId; 

  END LOOP;

  return query select omsid_, flowrate_, chakno_ 
               from tbl_calflow;
end;
$BODY$;

Однако обработка этой функции излишне усложняется

  • , если сначала копировать все строки MstOms в tmp_MstOms
  • получить идентификатор для одной строки из tbl_oms
  • [ 116] извлекает одну строку из MstOms, вычисляя скорость потока
  • сохраняет, что одна строка во временной таблице
  • удаляет только что обработанную строку из (другой) временной таблицы
  • подсчитывает число или строки в tbl_oms и, если оно не равно нулю, переходит к «следующей» строке

Это чрезвычайно неэффективный и сложный способ вычисления простого значения, которое плохо масштабируется для больших таблиц.

Выполнение построчной обработки таблиц в базе данных является антишаблоном для начала (а выполнение этого путем удаления, вставки и подсчета строк делает это еще медленнее).

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

CREATE OR REPLACE FUNCTION public.flowrate7()
    RETURNS TABLE(oms_id integer, flowrate numeric, chakno character varying) 
    LANGUAGE sql
AS $BODY$
  select omsid, 
         case when inletpressure> 0.5 then 1 else 0 end as flowrate, 
         chakno 
  from mstoms;    
$BODY$;

На самом деле мнение было бы более подходящим для этого.

create or replace view flowrate7
as
select omsid, 
       case when inletpressure> 0.5 then 1 else 0 end as flowrate, 
       chakno 
from mstoms;  
0
ответ дан a_horse_with_no_name 25 February 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: