PlSql в Delphi с Firedac

Я пытаюсь запустить plsql с помощью firedac, но у меня ничего не получается. Я пробовал с FDScript1 и FDQuery1.

Параметр не найден. Кто-нибудь знает, как запустить этот plsql?

ошибка

FDQuery1: параметр "TALHAO_ID" не найден.

unit Unit11;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, Data.DB,
  FireDAC.Comp.Client,FireDAC.Phys.PG, FireDAC.VCLUI.Wait, FireDAC.Stan.Param,
  FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Vcl.StdCtrls, Vcl.Grids,
  Vcl.DBGrids, FireDAC.Comp.DataSet, FireDAC.Comp.UI, Datasnap.Provider,
  Datasnap.DBClient, JvExStdCtrls, JvCombobox, JvDBCombobox, JvExControls,
  JvDBLookup, FireDAC.Comp.ScriptCommands, FireDAC.Comp.Script;

type
  TForm11 = class(TForm)
    Connection: TFDConnection;
    FDWait: TFDGUIxWaitCursor;
    FDQuery1: TFDQuery;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Button1: TButton;
    FDPhysPgDriverLink1: TFDPhysPgDriverLink;
    FDManager1: TFDManager;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    JvDBComboBox1: TJvDBComboBox;
    ComboCultura: TJvDBLookupCombo;
    FDScript1: TFDScript;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form11: TForm11;

implementation

{$R *.dfm}

procedure TForm11.Button2Click(Sender: TObject);
begin

 FDQuery1.Close;
 FDQuery1.SQL.text:='DO LANGUAGE plpgsql $$ '+
    'BEGIN                    '+
    '   update  talha_safra set  TALHAO_ID=:TALHAO_ID, SAFRA_ID=:SAFRA_ID, SIT_CADASTRAL=:SIT_CADASTRAL, REPLICACAO_EFETUADA=:REPLICACAO_EFETUADA where talhao_id=:talhao_id and safra_id=:safra_id ' +
    '        IF found THEN  '+
    '              RETURN;      '+
    '        END IF;            '+
    '            '+
    '            '+
    ' INSERT INTO TALHAO_SAFRA (TALHAO_ID, SAFRA_ID, SIT_CADASTRAL, REPLICACAO_EFETUADA)  VALUES  (:TALHAO_ID,:SAFRA_ID,:SIT_CADASTRAL,:REPLICACAO_EFETUADA) '+
    '        RETURN; '+
    '        EXCEPTION WHEN unique_violation THEN '+
    '        END; '+
    '               '+
    'END;             '+
    '$$;';
     FDQuery1.Params.ParamByName('TALHAO_ID').AsInteger:=12;
     FDQuery1.Params.ParamByName('SAFRA_ID').AsInteger:=1  ;
     FDQuery1.Params.ParamByName('SIT_CADASTRAL').AsString:='Ativo';
     FDQuery1.Params.ParamByName('REPLICACAO_EFETUADA').AsString:='NÃO';
     FDQuery1.Open;


end;

procedure TForm11.FormCreate(Sender: TObject);
begin
Connection.Connected:=true;
end;

end.  

person Rafael Maires Rangel    schedule 15.04.2015    source источник
comment
Можете ли вы отредактировать свой пост и, по крайней мере, приложить усилия для правильного отступа/форматирования кода, чтобы он был читабельным?   -  person Ken White    schedule 15.04.2015
comment
Кен Уайт — PLSQL работает на pgAdmin. С SQL проблем нет. Интересно, как передает параметры в Firedac . Если бы это была просто вставка, я бы использовал query1.parambyname('safra_id'). AsInteger, но уж сколько не PLSQL колесо. У меня была такая же проблема несколько лет назад с Firebird dbExpress, и когда я попытался выполнить блокировку выполнения   -  person Rafael Maires Rangel    schedule 15.04.2015
comment
Если вы публикуете код, а он беспорядочный и трудно читаемый, нет смысла его публиковать, за исключением того, что это необходимо, чтобы мы могли видеть, как объявляются параметры. Поэтому, пожалуйста, отредактируйте его, чтобы мы могли его прочитать, как я просил в своем последнем комментарии. Спасибо.   -  person Ken White    schedule 15.04.2015
comment
Не уверен, в чем проблема с параметрами, но вам нужно использовать FDQuery.ExecSQL вместо FDQuery.Open. Open для запросов, которые возвращают набор результатов (строки); UPDATE и INSERT не возвращают набор результатов. См. docwiki.embarcadero.com/Libraries/XE7. /ru/   -  person Ken White    schedule 15.04.2015
comment
Благодарен за возвращение. Я использовал FDQuery1.ExecSQL; и FDQuery1.Open ; и ошибка все еще продолжается .. FDQuery1: параметр «TALHAO_ID» не найден.   -  person Rafael Maires Rangel    schedule 15.04.2015
comment
plpgsql (PL/pgSQL) — процедурный язык Postgres, plsql (PL/SQL) — язык Oracle.   -  person Erwin Brandstetter    schedule 15.04.2015
comment
Благодарен Эрвин! Тогда помоги мне!   -  person Rafael Maires Rangel    schedule 15.04.2015
comment
Вероятно, вам нужно создать параметры вручную. FDQuery1.Params.CreateParam(ftInteger, 'TALHAO_ID', ptInput); ...   -  person oPsDCadarn    schedule 15.04.2015
comment
postgresql.org/docs/9.0/static/sql-do.html Блок кода обрабатывается так, как если бы он был телом функции без параметров, возвращающей void.   -  person da-soft    schedule 16.04.2015
comment
oPsDCadarn - Этого не было   -  person Rafael Maires Rangel    schedule 16.04.2015


Ответы (1)


У вас есть несколько проблем. Один из них заключается в том, что вместо Open вы должны использовать ExecSQL для обновления/вставки в базу данных postgreSQL. Вторая проблема заключается в том, что ваш запрос неверен. Согласно этому документу http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html присвоение значений переменной plpgsql выполняется аналогично паскалю/Delphi с использованием знака присваивания ":=", а не "=:", как в вашем запросе. Во-вторых, при выполнении запроса через язык plpgsql или sql знак присваивания - "=", а не ":=" или "=:". Исправьте свои ошибки в SQL, и функция будет выполнена успешно. Ваше ответное сообщение является формой бэкэнда postgreSQL.

person JD_GRINDER    schedule 16.04.2015
comment
JD_GRINDER - Я реализовал все предложенные в посте изменения, но все равно ошибка. Я думаю, что Delphi не готова выполнять такие команды. - person Rafael Maires Rangel; 16.04.2015