{"id":294750,"date":"2019-11-17T21:00:22","date_gmt":"2019-11-17T21:00:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=294750"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=294750","title":{"rendered":"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 UDR \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Pascal"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\">\n<p>\u0412 Firebird \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u0432\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044f\u0437\u044b\u043a\u0430 PSQL \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u2014 UDF (User Defined Functions). UDF \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412 Firebird 3.0 \u0431\u044b\u043b\u0430 \u0432\u0432\u0435\u0434\u0435\u043d\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Firebird. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f External Engine (\u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u043a\u0438). \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c UDR (User Defined Routines \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u0432\u0438\u0436\u043a\u0430 FirebirdExternal. <\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c UDR, \u043e \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u0445, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f UDR \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Pascal. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e API.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e UDR \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0433\u043e Firebird API.<br \/>  \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p><\/blockquote>\n<p>UDR \u0438\u043c\u0435\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Legacy UDF:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u043e \u0438 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b (\u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435, \u0442\u0430\u043a \u0438 \u0441\u0435\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435), \u0430 \u0442\u0430\u043a \u0436\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b;<\/li>\n<li>\u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0412 \u0440\u044f\u0434\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 (\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043f\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0443) \u0442\u0438\u043f\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 UDF. UDR \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 PSQL \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c\u0438;<\/li>\n<li>UDR \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c<br \/>  \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435;<\/li>\n<li>\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a Firebird \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435;<\/li>\n<li>\u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (UDR) \u043c\u043e\u0436\u043d\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 PSQL \u043f\u0430\u043a\u0435\u0442\u0430\u0445;<\/li>\n<li>UDR \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0435 \u043a\u043e\u0434\u044b), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 External Engine \u043f\u043b\u0430\u0433\u0438\u043d. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0430 Java \u0438\u043b\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 .NET \u044f\u0437\u044b\u043a\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f UDR \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 PSQL \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f<br \/>  \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c. \u0417\u0430\u0433\u043b\u0443\u0448\u043a\u0430<br \/>  \u0431\u044b\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0438\u0437-\u0437\u0430 \u043d\u0435\u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<br \/>  \u0442\u0435\u0441\u0442\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 UDR \u0438 UDF \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e UDR \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432<br \/>  2.5 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c<br \/>  UDR \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0432\u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 PSQL \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u043e\u0442<br \/>  \u043c\u043e\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d. \u0412 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u044d\u0442\u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0442\u044c<br \/>  \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u044b\u043c\u0438.<\/p><\/blockquote>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u044d\u0442\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043f\u0440\u0438 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432 \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430,<br \/>  \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u043c\u0435\u0442\u044c \u0432\u0432\u0438\u0434\u0443 \u0438\u043c\u0435\u043d\u043d\u043e UDR (\u0430 \u043d\u0435 UDF).<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0412\u0441\u0435 \u043d\u0430\u0448\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 Delphi 2009 \u0438 \u0441\u0442\u0430\u0440\u0448\u0435, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430 Free Pascal. \u0412\u0441\u0435<br \/>  \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a \u0432 Delphi, \u0442\u0430\u043a \u0438 \u0432 Free Pascal, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e<br \/>  \u043d\u0435 \u043e\u0433\u043e\u0432\u043e\u0440\u0435\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p><\/blockquote>\n<p>  <\/p>\n<h2 id=\"firebird-api\">Firebird API<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u044f \u043e \u043d\u043e\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c API Firebird. \u0414\u0430\u043d\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f Firebird API. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 \u043d\u0438\u043c \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Firebird (<code>doc\/Using_OO_API.html<\/code>).<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b API, \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 Firebird \u043f\u043e\u0434 Windows, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0445 \u0438\u0437 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u0445 \u043f\u043e\u0434 Linux \u0441\u0436\u0430\u0442\u044b\u0445 tarbar \u0444\u0430\u0439\u043b\u043e\u0432 (\u043f\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u0440\u0445\u0438\u0432\u0430 <code>\/opt\/firebird\/include\/firebird\/Firebird.pas<\/code>).<\/p>\n<p>  <\/p>\n<h3 id=\"cloop\">CLOOP<\/h3>\n<p>  <\/p>\n<p>CLOOP \u2014 Cross Language Object Oriented Programming. \u042d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0443 Firebird. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u0430\u0445 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/tree\/B3_0_Release\/extern\/cloop\">https:\/\/github.com\/FirebirdSQL\/firebird\/tree\/B3_0_Release\/extern\/cloop<\/a>. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u043d, \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 <code>include\/firebird\/FirebirdInterface.idl<\/code> \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c API \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (<code>IdlFbInterfaces.h<\/code> \u0438\u043b\u0438 <code>Firebird.pas<\/code>).<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f Object pascal \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">cloop FirebirdInterface.idl pascal Firebird.pas Firebird --uses SysUtils \\   --interfaceFile Pascal.interface.pas \\   --implementationFile Pascal.implementation.pas \\   --exceptionClass FbException --prefix I \\   --functionsFile fb_get_master_interface.pas<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b\u044b <code>Pascal.interface.pas<\/code>, <code>Pascal.implementation.pas<\/code> \u0438 <code>fb_get_master_interface.pas<\/code> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/tree\/B3_0_Release\/src\/misc\/pascal\">https:\/\/github.com\/FirebirdSQL\/firebird\/tree\/B3_0_Release\/src\/misc\/pascal<\/a>.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 Firebird API \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u0435\u0444\u0438\u043a\u0441 I, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0432 Object Pascal.<\/p><\/blockquote>\n<p>  <\/p>\n<h4 id=\"konstanty\">\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b<\/h4>\n<p>  <\/p>\n<p>\u0412 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 <code>Firebird.pas<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 <code>isc_*<\/code> \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b. \u042d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u043e\u0432 C\/C++ \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434 \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/B3_0_Release\/src\/include\/consts_pub.h\">https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/B3_0_Release\/src\/include\/consts_pub.h<\/a>. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Pascal \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f AWK \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430. \u0412 Windows \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Gawk for Windows \u0438\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Windows Subsystem for Linux (\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432 Windows 10). \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">awk -f Pascal.Constants.awk consts_pub.h &gt; const.pas<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e const \u0444\u0430\u0439\u043b\u0430 <code>Firebird.pas<\/code> \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 implementation. \u0424\u0430\u0439\u043b <code>Pascal.Constants.awk<\/code>, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<br \/>  <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/tree\/B3_0_Release\/src\/misc\/pascal\">https:\/\/github.com\/FirebirdSQL\/firebird\/tree\/B3_0_Release\/src\/misc\/pascal<\/a>.<\/p>\n<p>  <\/p>\n<h3 id=\"upravlenie-vremenem-zhizni\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438<\/h3>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b Firebird \u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 COM, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0430\u0447\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 Firebird \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u0434\u0435\u043b\u043e \u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438: IDisposable \u0438 IReferenceCounted. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u0435\u043d \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432: IPlugin \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438, \u043a\u0430\u043a \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438. \u041a \u043d\u0438\u043c \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b SQL.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u0441\u0441\u044b\u043b\u043e\u043a. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, IMaster, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 API, \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e. \u0414\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 API \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430; \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IStatus \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f<br \/>  \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u043c. \u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0445 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e dispose().<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/strong><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0435\u0433\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c<br \/>  \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IReferenceCounted, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u0441\u0441\u044b\u043b\u043e\u043a.<br \/>  \u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0441 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u043e\u043c \u0441\u0441\u044b\u043b\u043e\u043a, \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e<br \/>  \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430 release().<\/p><\/blockquote>\n<p>  <\/p>\n<h2 id=\"obyavlenie-udr\">\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 UDR<\/h2>\n<p>  <\/p>\n<p>UDR \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e DDL \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u043e\u0434\u043e\u0431\u043d\u043e \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 PSQL \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u043b\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f EXTERNAL NAME.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0449\u0438\u043c \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">EXTERNAL NAME '&lt;extname&gt;' ENGINE &lt;engine&gt; [AS &lt;extbody&gt;]  &lt;extname&gt; ::= '&lt;module name&gt;!&lt;routine name&gt;[!&lt;misc info&gt;]'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f EXTERNAL NAME \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435. \u0414\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0434\u0432\u0438\u0436\u043e\u043a UDR, \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043c\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0434\u0443\u043b\u044f \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a (!).<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438 ENGINE \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0412 Firebird \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 (C, C++, Pascal) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043e\u043a UDR. \u0414\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 Java \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043e\u043a Java.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 AS \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u2014 &#171;\u0442\u0435\u043b\u043e&#187; \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f (\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430), \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d SQL \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0411\u0414 \u0438\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0432\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439.<\/p>\n<p>  <\/p>\n<h3 id=\"vneshnie-funkcii\">\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">{CREATE [OR ALTER] | RECREATE} FUNCTION funcname [(&lt;inparam&gt; [, &lt;inparam&gt; ...])]  RETURNS &lt;type&gt; [COLLATE collation] [DETERMINISTIC] \u00a0  EXTERNAL NAME &lt;extname&gt; ENGINE &lt;engine&gt; [AS &lt;extbody&gt;]   &lt;inparam&gt; ::= &lt;param_decl&gt; [{= |DEFAULT} &lt;value&gt;]   &lt;value&gt; ::= {literal | NULL | context_var}   &lt;param_decl&gt; ::= paramname &lt;type&gt; [NOT NULL] [COLLATE collation]   &lt;extname&gt; ::= '&lt;module name&gt;!&lt;routine name&gt; [!&lt;misc info&gt;]'   &lt;type&gt; ::= &lt;datatype&gt; | [TYPE OF] domain | TYPE OF COLUMN rel.col  &lt;datatype&gt; ::=    {SMALLINT | INT[EGER] | BIGINT}  | BOOLEAN  | {FLOAT | DOUBLE PRECISION}  | {DATE | TIME | TIMESTAMP}  | {DECIMAL | NUMERIC} [(precision [, scale])]  | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)] [CHARACTER SET charset]  | {NCHAR |NATIONAL CHARACTER | NATIONAL CHAR} [VARYING] [(size)]  | BLOB [SUB_TYPE {subtype_num | subtype_name}] [SEGMENT SIZE seglen] [CHARACTER SET charset]  | BLOB [(seglen [, subtype_num])]<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 ALTER FUNCTION.<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ALTER FUNCTION funcname [(&lt;inparam&gt; [, &lt;inparam&gt; ...])] RETURNS &lt;type&gt; [COLLATE collation] [DETERMINISTIC] EXTERNAL NAME &lt;extname&gt; ENGINE &lt;engine&gt; [AS &lt;extbody&gt;]  &lt;extname&gt; ::= '&lt;module name&gt;!&lt;routine name&gt;[!&lt;misc info&gt;]'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 DROP FUNCTION.<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">DROP FUNCTION funcname<\/code><\/pre>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<caption>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/caption>\n<thead>\n<tr>\n<th>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/th>\n<th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>funcname<\/td>\n<td>\u0418\u043c\u044f \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u043e 31 \u0431\u0430\u0439\u0442\u0430.<\/td>\n<\/tr>\n<tr>\n<td>inparam<\/td>\n<td>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. <\/td>\n<\/tr>\n<tr>\n<td>module name<\/td>\n<td>\u0418\u043c\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f.<\/td>\n<\/tr>\n<tr>\n<td>routine name<\/td>\n<td>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.<\/td>\n<\/tr>\n<tr>\n<td>misc info<\/td>\n<td>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432<br \/>  \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.<\/td>\n<\/tr>\n<tr>\n<td>engine<\/td>\n<td>\u0418\u043c\u044f \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041e\u0431\u044b\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u044f UDR.<\/td>\n<\/tr>\n<tr>\n<td>extbody<\/td>\n<td>\u0422\u0435\u043b\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f UDR \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439. <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u041e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0443 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 PSQL \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432 &#171;\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043f\u043e \u044f\u0437\u044b\u043a\u0443 SQL&#187;. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<p><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u0440\u0451\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">create function sum_args (     n1 integer,     n2 integer,     n3 integer ) returns integer     external name 'udrcpp_example!sum_args'     engine udr;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 udrcpp_example. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c sum_args. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043e\u043a UDR.<\/p>\n<p>  <\/p>\n<p><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Java<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">create or alter function regex_replace (   regex varchar(60),   str varchar(60),   replacement varchar(60) ) returns varchar(60)   external name 'org.firebirdsql.fbjava.examples.fbjava_example.FbRegex.replace(       String, String, String)'   engine java;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 replace \u043a\u043b\u0430\u0441\u0441\u0430 <code>org.firebirdsql.fbjava.examples.fbjava_example.FbRegex<\/code>. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043e\u043a Java.<\/p>\n<p>  <\/p>\n<h3 id=\"vneshnie-procedury\">\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b<\/h3>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">{CREATE [OR ALTER] | RECREATE} PROCEDURE procname  [(&lt;inparam&gt; [, &lt;inparam&gt; ...])]  RETURNS (&lt;outparam&gt; [&lt;outparam&gt; ...])  EXTERNAL NAME &lt;extname&gt; ENGINE &lt;engine&gt;  [AS &lt;extbody&gt;]   &lt;inparam&gt; ::= &lt;param_decl&gt; [{= | DEFAULT} &lt;value&gt;]   &lt;outparam&gt; ::= &lt;param_decl&gt; &lt;value&gt; ::= {literal | NULL | context_var}  &lt;param_decl&gt; ::= paramname &lt;type&gt; [NOT NULL] [COLLATE collation]   &lt;extname&gt; ::= '&lt;module name&gt;!&lt;routine name&gt;[!&lt;misc info&gt;]'   &lt;type&gt; ::= &lt;datatype&gt; | [TYPE OF] domain | TYPE OF COLUMN rel.col   &lt;datatype&gt; ::=     {SMALLINT | INT[EGER] | BIGINT}    | BOOLEAN    | {FLOAT | DOUBLE PRECISION}   | {DATE | TIME | TIMESTAMP}    | {DECIMAL | NUMERIC} [(precision [,scale])]    | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)] [CHARACTER SET charset]    | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING] [(size)]    | BLOB [SUB_TYPE {subtype_num | subtype_name}] [SEGMENT SIZE seglen] [CHARACTER SET charset]    | BLOB [(seglen [, subtype_num])]<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 ALTER PROCEDURE.<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ALTER PROCEDURE procname [(&lt;inparam&gt; [, &lt;inparam&gt; ...])] RETURNS (&lt;outparam&gt; [, &lt;outparam&gt; ...]) EXTERNAL NAME &lt;extname&gt; ENGINE &lt;engine&gt; [AS &lt;extbody&gt;]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 DROP PROCEDURE.<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">DROP PROCEDURE procname<\/code><\/pre>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<caption>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b<\/caption>\n<thead>\n<tr>\n<th>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/th>\n<th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>funcname<\/td>\n<td>\u0418\u043c\u044f \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u041c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u043e 31 \u0431\u0430\u0439\u0442\u0430.<\/td>\n<\/tr>\n<tr>\n<td>inparam<\/td>\n<td>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. <\/td>\n<\/tr>\n<tr>\n<td>outparam<\/td>\n<td>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. <\/td>\n<\/tr>\n<tr>\n<td>module name<\/td>\n<td>\u0418\u043c\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430.<\/td>\n<\/tr>\n<tr>\n<td>routine name<\/td>\n<td>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0438\u043c\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.<\/td>\n<\/tr>\n<tr>\n<td>misc info<\/td>\n<td>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432<br \/>  \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.<\/td>\n<\/tr>\n<tr>\n<td>engine<\/td>\n<td>\u0418\u043c\u044f \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440. \u041e\u0431\u044b\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u044f UDR.<\/td>\n<\/tr>\n<tr>\n<td>extbody<\/td>\n<td>\u0422\u0435\u043b\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f UDR \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439. <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0443 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 PSQL \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432 &#171;\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043f\u043e \u044f\u0437\u044b\u043a\u0443 SQL&#187;. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0441 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">create procedure gen_rows_pascal (     start_n integer not null,     end_n integer not null ) returns (     result integer not null )     external name 'pascaludr!gen_rows'     engine udr;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 pascaludr. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c gen_rows. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043e\u043a UDR.<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">create or alter procedure write_log (   message varchar(100) )   external name 'pascaludr!write_log'   engine udr;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 pascaludr. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c write_log. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043e\u043a UDR.<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">create or alter procedure employee_pgsql (   -- Firebird 3.0.0 has a bug with external procedures without parameters   dummy integer = 1 ) returns (   id type of column employee.id,   name type of column employee.name )   external name 'org.firebirdsql.fbjava.examples.fbjava_example.FbJdbc     .executeQuery()!jdbc:postgresql:employee|postgres|postgres'   engine java   as 'select * from employee';<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 executeQuery \u043a\u043b\u0430\u0441\u0441\u0430<br \/>  <code>org.firebirdsql.fbjava.examples.fbjava_example.FbJdbc<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u043a\u0430 (!) \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 JDBC. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043e\u043a Java. \u0417\u0434\u0435\u0441\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 &#171;\u0442\u0435\u043b\u0430&#187; \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f SQL \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 Firebird 3.0 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0430\u0433 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"razmeschenie-vneshnih-procedur-i-funkciy-vnutri-paketov\">\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u0413\u0440\u0443\u043f\u043f\u0443 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432 PSQL \u043f\u0430\u043a\u0435\u0442\u0430\u0445. \u0412 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043a\u0430\u043a \u0432\u043d\u0435\u0448\u043d\u0438\u0435, \u0442\u0430\u043a \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 PSQL \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">{CREATE [OR ALTER] | RECREATE} PACKAGE package_name AS BEGIN   [&lt;package_item&gt; ...] END  {CREATE | RECREATE} PACKAGE BODY package_name AS BEGIN   [&lt;package_item&gt; ...]   [&lt;package_body_item&gt; ...] END  &lt;package_item&gt; ::= &lt;function_decl&gt;; | &lt;procedure_decl&gt;;  &lt;function_decl&gt; ::=   FUNCTION func_name [(&lt;in_params&gt;)]   RETURNS &lt;type&gt; [COLLATE collation] [DETERMINISTIC]  &lt;procedure_decl&gt; ::=   PROCEDURE proc_name [(&lt;in_params&gt;)]   [RETURNS (&lt;out_params&gt;)]  &lt;package_body_item&gt; ::= &lt;function_impl&gt; | &lt;procedure_impl&gt;  &lt;function_impl&gt; ::=   FUNCTION func_name [(&lt;in_impl_params&gt;)]   RETURNS &lt;type&gt; [COLLATE collation] [DETERMINISTIC]   &lt;routine body&gt;  &lt;procedure_impl&gt; ::=    PROCEDURE proc_name [(&lt;in_impl_params&gt;)]   [RETURNS (&lt;out_params&gt;)]   &lt;routine body&gt;  &lt;routine body&gt; ::= &lt;sql routine body&gt; | &lt;external body reference&gt;  &lt;sql routine body&gt; ::= AS \u00a0\u00a0\u00a0   [&lt;declarations&gt;] BEGIN   [&lt;PSQL_statements&gt;] \u00a0\u00a0\u00a0 END  &lt;declarations&gt; ::= &lt;declare_item&gt; [&lt;declare_item&gt; ...]  &lt;declare_item&gt; ::=     &lt;declare_var&gt;;   | &lt;declare_cursor&gt;;   | &lt;subroutine declaration&gt;;    | &lt;subroutine implimentation&gt;  &lt;subroutine declaration&gt; ::= &lt;subfunc_decl&gt; | &lt;subproc_decl&gt;  &lt;subroutine implimentation&gt; ::= &lt;subfunc_impl&gt; | &lt;subproc_impl&gt;  &lt;external body reference&gt; ::=   EXTERNAL NAME &lt;extname&gt; ENGINE &lt;engine&gt;   [AS &lt;extbody&gt;]  &lt;extname&gt; ::= '&lt;module name&gt;!&lt;routine name&gt;[!&lt;misc info&gt;]'<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u043c\u044f, \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0438\u0445 \u0442\u0438\u043f\u044b, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0430 \u0432 \u0442\u0435\u043b\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u0441\u0451 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043a\u0440\u043e\u043c\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435 (\u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 EXTERNAL NAME), \u0438\u043c\u044f \u0434\u0432\u0438\u0436\u043a\u0430, \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e &#171;\u0442\u0435\u043b\u043e&#187; \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b\/\u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0432\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 UDR \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435 (\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435) PCRE, \u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e UDR \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 PSQL \u043f\u0430\u043a\u0435\u0442\u044b, \u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u044b\u043b\u0438 \u0431\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u044b \u043a\u0430\u043a \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u0442\u0430\u043a \u0438 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 PSQL \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438. \u042d\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0430 \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u0443, \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. PSQL \u043f\u0430\u043a\u0435\u0442\u044b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044e\u0442 \u043d\u0430\u043c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">RegExp Package<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">SET TERM ^;  CREATE OR ALTER PACKAGE REGEXP AS BEGIN   PROCEDURE preg_match(       APattern VARCHAR(8192), ASubject VARCHAR(8192))     RETURNS (Matches VARCHAR(8192));    FUNCTION preg_is_match(       APattern VARCHAR(8192), ASubject VARCHAR(8192))     RETURNS BOOLEAN;    FUNCTION preg_replace(       APattern VARCHAR(8192),       AReplacement VARCHAR(8192),       ASubject VARCHAR(8192))     RETURNS VARCHAR(8192);    PROCEDURE preg_split(       APattern VARCHAR(8192),       ASubject VARCHAR(8192))     RETURNS (Lines VARCHAR(8192));    FUNCTION preg_quote(       AStr VARCHAR(8192),       ADelimiter CHAR(10) DEFAULT NULL)     RETURNS VARCHAR(8192); END^  RECREATE PACKAGE BODY REGEXP AS BEGIN   PROCEDURE preg_match(       APattern VARCHAR(8192),       ASubject VARCHAR(8192))     RETURNS (Matches VARCHAR(8192))     EXTERNAL NAME 'PCRE!preg_match' ENGINE UDR;    FUNCTION preg_is_match(       APattern VARCHAR(8192),       ASubject VARCHAR(8192))     RETURNS BOOLEAN   AS   BEGIN     RETURN EXISTS(       SELECT * FROM preg_match(:APattern, :ASubject));   END    FUNCTION preg_replace(       APattern VARCHAR(8192),       AReplacement VARCHAR(8192),       ASubject VARCHAR(8192))     RETURNS VARCHAR(8192)     EXTERNAL NAME 'PCRE!preg_replace' ENGINE UDR;    PROCEDURE preg_split(       APattern VARCHAR(8192),       ASubject VARCHAR(8192))     RETURNS (Lines VARCHAR(8192))     EXTERNAL NAME 'PCRE!preg_split' ENGINE UDR;    FUNCTION preg_quote(       AStr VARCHAR(8192),       ADelimiter CHAR(10))     RETURNS VARCHAR(8192)     EXTERNAL NAME 'PCRE!preg_quote' ENGINE UDR; END^  SET TERM ;^<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h3 id=\"vneshnie-triggery\">\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b<\/h3>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">{CREATE [OR ALTER] | RECREATE} TRIGGER trigname  {&lt;relation_trigger_legacy&gt; | &lt;relation_trigger_sql2003&gt; | &lt;database_trigger&gt; | &lt;ddl_trigger&gt; }  &lt;external-body&gt;  &lt;external-body&gt; ::=    EXTERNAL NAME &lt;extname&gt; ENGINE &lt;engine&gt;    [AS &lt;extbody&gt;]   &lt;relation_trigger_legacy&gt; ::=    FOR {tablename | viewname} [ACTIVE | INACTIVE]    {BEFORE | AFTER} &lt;mutation_list&gt; [POSITION number]  &lt;relation_trigger_sql2003&gt; ::=    [ACTIVE | INACTIVE]    {BEFORE | AFTER} &lt;mutation_list&gt; [POSITION number]    ON {tablename | viewname}   &lt;database_trigger&gt; ::=    [ACTIVE | INACTIVE] ON db_event [POSITION number]   &lt;ddl_trigger&gt; ::=    [ACTIVE | INACTIVE]    {BEFORE | AFTER} &lt;ddl_events&gt; [POSITION number]  &lt;mutation_list&gt; ::= &lt;mutation&gt; [OR &lt;mutation&gt; [OR &lt;mutation&gt;]]   &lt;mutation&gt; ::= INSERT | UPDATE | DELETE  &lt;db_event&gt; ::=      CONNECT | DISCONNECT    | TRANSACTION START | TRANSACTION COMMIT | TRANSACTION ROLLBACK   &lt;ddl_events&gt; ::= ANY DDL STATEMENT | &lt;ddl_event_item&gt; [{OR &lt;ddl_event_item&gt;} ...]   &lt;ddl_event_item&gt; ::=      CREATE TABLE | ALTER TABLE | DROP TABLE    | CREATE PROCEDURE | ALTER PROCEDURE | DROP PROCEDURE    | CREATE FUNCTION | ALTER FUNCTION | DROP FUNCTION    | CREATE TRIGGER | ALTER TRIGGER | DROP TRIGGER    | CREATE EXCEPTION | ALTER EXCEPTION | DROP EXCEPTION    | CREATE VIEW | ALTER VIEW | DROP VIEW    | CREATE DOMAIN | ALTER DOMAIN | DROP DOMAIN    | CREATE ROLE | ALTER ROLE | DROP ROLE    | CREATE SEQUENCE | ALTER SEQUENCE | DROP SEQUENCE    | CREATE USER | ALTER USER | DROP USER    | CREATE INDEX | ALTER INDEX | DROP INDEX    | CREATE COLLATION | DROP COLLATION | ALTER CHARACTER SET    | CREATE PACKAGE | ALTER PACKAGE | DROP PACKAGE    | CREATE PACKAGE BODY | DROP PACKAGE BODY    | CREATE MAPPING | ALTER MAPPING | DROP MAPPING<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 ALTER TRIGGER.<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ALTER TRIGGER trigname {    [ACTIVE | INACTIVE] [ {BEFORE | AFTER}   {&lt;mutation_list&gt; | &lt;ddl_events&gt;} | ON db_event ]   [POSITION number]    [&lt;external-body&gt;]   &lt;external-body&gt; ::=    EXTERNAL NAME &lt;extname&gt; ENGINE &lt;engine&gt;    [AS &lt;extbody&gt;]   &lt;extname&gt; ::= '&lt;module name&gt;!&lt;routine name&gt;[!&lt;misc info&gt;]'   &lt;mutation_list&gt; ::= &lt;mutation&gt; [OR &lt;mutation&gt; [OR &lt;mutation&gt;]]  &lt;mutation&gt; ::= { INSERT | UPDATE | DELETE }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 DROP TRIGGER.<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">DROP TRIGGER trigname<\/code><\/pre>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/th>\n<th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>trigname<\/td>\n<td>\u0418\u043c\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u041c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u043e 31 \u0431\u0430\u0439\u0442\u0430.<\/td>\n<\/tr>\n<tr>\n<td>relation_trigger_legacy<\/td>\n<td>\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 (\u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u0435).<\/td>\n<\/tr>\n<tr>\n<td>relation_trigger_sql2003<\/td>\n<td>\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 SQL-2003.<\/td>\n<\/tr>\n<tr>\n<td>database_trigger<\/td>\n<td>\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/td>\n<\/tr>\n<tr>\n<td>ddl_trigger<\/td>\n<td>\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 DDL \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430.<\/td>\n<\/tr>\n<tr>\n<td>tablename<\/td>\n<td>\u0418\u043c\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/td>\n<\/tr>\n<tr>\n<td>viewname<\/td>\n<td>\u0418\u043c\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/td>\n<\/tr>\n<tr>\n<td>mutation_list<\/td>\n<td>\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/td>\n<\/tr>\n<tr>\n<td>mutation<\/td>\n<td>\u041e\u0434\u043d\u043e \u0438\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/td>\n<\/tr>\n<tr>\n<td>db_event<\/td>\n<td>\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.<\/td>\n<\/tr>\n<tr>\n<td>ddl_events<\/td>\n<td>\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445.<\/td>\n<\/tr>\n<tr>\n<td>ddl_event_item<\/td>\n<td>\u041e\u0434\u043d\u043e \u0438\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445.<\/td>\n<\/tr>\n<tr>\n<td>number<\/td>\n<td>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u041e\u0442 0 \u0434\u043e 32767.<\/td>\n<\/tr>\n<tr>\n<td>extbody<\/td>\n<td>\u0422\u0435\u043b\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f UDR \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439.<\/td>\n<\/tr>\n<tr>\n<td>module name<\/td>\n<td>\u0418\u043c\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0442\u0440\u0438\u0433\u0433\u0435\u0440.<\/td>\n<\/tr>\n<tr>\n<td>routine name<\/td>\n<td>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0438\u043c\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.<\/td>\n<\/tr>\n<tr>\n<td>misc info<\/td>\n<td>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.<\/td>\n<\/tr>\n<tr>\n<td>engine<\/td>\n<td>\u0418\u043c\u044f \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u044f UDR.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u0441 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">create database 'c:\\temp\\slave.fdb';  create table persons (     id integer not null,     name varchar(60) not null,     address varchar(60),     info blob sub_type text );  commit;  create database 'c:\\temp\\master.fdb';  create table persons (     id integer not null,     name varchar(60) not null,     address varchar(60),     info blob sub_type text );  create table replicate_config (     name varchar(31) not null,     data_source varchar(255) not null );  insert into replicate_config (name, data_source)    values ('ds1', 'c:\\temp\\slave.fdb');  create trigger persons_replicate     after insert on persons     external name 'udrcpp_example!replicate!ds1'     engine udr;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 udrcpp_example. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c replicate. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043e\u043a UDR.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>ds1<\/code>, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>replicate_config<\/em> \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<h2 id=\"struktura-udr\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 UDR<\/h2>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e UDR. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 UDR \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Pascal. \u0414\u043b\u044f \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f UDR \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437 <code>examples\/udr\/<\/code> \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u043d\u0430 Pascal.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u043e\u0432\u043e\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u043e\u0432\u0451\u043c MyUdr. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0443 \u0432\u0430\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b <code>MyUdr.dpr<\/code> (\u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Delphi) \u0438\u043b\u0438 \u0444\u0430\u0439\u043b <code>MyUdr.lpr<\/code> (\u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Lazarus). \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">library MyUdr;  {$IFDEF FPC}   {$MODE DELPHI}{$H+} {$ENDIF}  uses {$IFDEF unix}     cthreads,     \/\/ the c memory manager is on some systems much faster for multi-threading     cmem, {$ENDIF}   UdrInit in 'UdrInit.pas',   SumArgsFunc in 'SumArgsFunc.pas';  exports firebird_udr_plugin;  end.<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>firebird_udr_plugin<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 UDR. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 UdrInit.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u0432\u0430\u0448\u0443 UDR \u0432 Free Pascal, \u0442\u043e \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b. \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 <code>{$mode objfpc}<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 Object Pascal. \u0412\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0451 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0443 <code>{$mode delphi}<\/code> \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 Delphi. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043e\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 FPC, \u0442\u0430\u043a \u0438 \u0432 Delphi \u044f \u0432\u044b\u0431\u0438\u0440\u0430\u044e \u0440\u0435\u0436\u0438\u043c <code>{$mode delphi}<\/code>.<\/p>\n<p>  \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 <code>{$H+}<\/code> \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0438\u043f\u044b string, ansistring, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u043b\u044c-\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 PChar, PAnsiChar, PWideChar.<\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432 Linux \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 Unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445.<\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"registraciya-procedur-funkciy-ili-triggerov\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044c UdrInit, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">unit UdrInit;  {$IFDEF FPC}   {$MODE DELPHI}{$H+} {$ENDIF}  interface  uses   Firebird;  \/\/ \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0434\u043b\u044f External Engine \u043c\u043e\u0434\u0443\u043b\u044f UDR function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl;  implementation  uses   SumArgsFunc;  var   myUnloadFlag: Boolean;   theirUnloadFlag: BooleanPtr;  function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl; begin   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   AUdrPlugin.registerFunction(AStatus, 'sum_args',     TSumArgsFunctionFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b   \/\/AUdrPlugin.registerProcedure(AStatus, 'sum_args_proc',   \/\/  TSumArgsProcedureFactory.Create());   \/\/AUdrPlugin.registerProcedure(AStatus, 'gen_rows', TGenRowsFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b   \/\/AUdrPlugin.registerTrigger(AStatus, 'test_trigger',   \/\/  TMyTriggerFactory.Create());    theirUnloadFlag := AUnloadFlagLocal;   Result := @myUnloadFlag; end;  initialization  myUnloadFlag := false;  finalization  if ((theirUnloadFlag &lt;&gt; nil) and not myUnloadFlag) then   theirUnloadFlag^ := true;  end.<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>firebird_udr_plugin<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u043d\u0430\u0448\u0438\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u0430\u0431\u0440\u0438\u043a\u0443. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IUdrPlugin:<\/p>\n<p>  <\/p>\n<ul>\n<li>registerFunction \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e;<\/li>\n<li>registerProcedure \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443;<\/li>\n<li>registerTrigger \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440, \u0434\u0430\u043b\u0435\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430). \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0438\u043c\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b\/\u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043d\u0430 SQL. \u0422\u0440\u0435\u0442\u044c\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430).<\/p>\n<p>  <\/p>\n<h3 id=\"realizaciya-vneshney-funkcii\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0438 \u0441\u0430\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 SumArgsFunc. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u044f SumArgsFunc<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">unit SumArgsFunc;  {$IFDEF FPC} {$MODE DELPHI}{$H+} {$ENDIF}  interface  uses   Firebird;  \/\/ ********************************************************* \/\/    create function sum_args ( \/\/      n1 integer, \/\/      n2 integer, \/\/      n3 integer \/\/    ) returns integer \/\/    external name 'myudr!sum_args' \/\/    engine udr; \/\/ *********************************************************  type   \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435   TSumArgsInMsg = record     n1: Integer;     n1Null: WordBool;     n2: Integer;     n2Null: WordBool;     n3: Integer;     n3Null: WordBool;   end;   PSumArgsInMsg = ^TSumArgsInMsg;    \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435   TSumArgsOutMsg = record     result: Integer;     resultNull: WordBool;   end;   PSumArgsOutMsg = ^TSumArgsOutMsg;    \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 TSumArgsFunction   TSumArgsFunctionFactory = class(IUdrFunctionFactoryImpl)     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438     procedure dispose(); override;      { \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043a\u0435\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445.       \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AInBuilder \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)       @param(AOutBuilder \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)     }     procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AInBuilder: IMetadataBuilder;       AOutBuilder: IMetadataBuilder); override;      { \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 TSumArgsFunction        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @returns(\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)     }     function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalFunction; override;   end;    \/\/ \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f TSumArgsFunction.   TSumArgsFunction = class(IExternalFunctionImpl)     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438     procedure dispose(); override;      { \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 execute \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442       \u044f\u0434\u0440\u0443 \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438       \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432,       \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 ExternalEngine::getCharSet.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AName \u0418\u043c\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)       @param(AName \u0414\u043b\u0438\u043d\u0430 \u0438\u043c\u0435\u043d\u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)     }     procedure getCharSet(AStatus: IStatus; AContext: IExternalContext;       AName: PAnsiChar; ANameSize: Cardinal); override;      { \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AInMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)       @param(AOutMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)     }     procedure execute(AStatus: IStatus; AContext: IExternalContext;       AInMsg: Pointer; AOutMsg: Pointer); override;   end;  implementation  { TSumArgsFunctionFactory }  procedure TSumArgsFunctionFactory.dispose; begin   Destroy; end;  function TSumArgsFunctionFactory.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalFunction; begin   Result := TSumArgsFunction.Create(); end;  procedure TSumArgsFunctionFactory.setup(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata;   AInBuilder, AOutBuilder: IMetadataBuilder); begin  end;  { TSumArgsFunction }  procedure TSumArgsFunction.dispose; begin   Destroy; end;  procedure TSumArgsFunction.execute(AStatus: IStatus; AContext: IExternalContext;   AInMsg, AOutMsg: Pointer); var   xInput: PSumArgsInMsg;   xOutput: PSumArgsOutMsg; begin   \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c   xInput := PSumArgsInMsg(AInMsg);   xOutput := PSumArgsOutMsg(AOutMsg);   \/\/ \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 NULL \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 NULL   xOutput^.resultNull := xInput^.n1Null or xInput^.n2Null or xInput^.n3Null;   xOutput^.result := xInput^.n1 + xInput^.n2 + xInput^.n3; end;  procedure TSumArgsFunction.getCharSet(AStatus: IStatus;   AContext: IExternalContext; AName: PAnsiChar; ANameSize: Cardinal); begin end;  end.<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IUdrFunctionFactory. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 IUdrFunctionFactoryImpl. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u0430 \u0441\u0432\u043e\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432. \u041f\u043e\u0437\u0436\u0435 \u043c\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 dispose \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438, \u0432 \u043d\u0451\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 setup \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043a\u0435\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043d\u0451\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0451\u043c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 newItem \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e IRoutineMetadata \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0442\u0435\u043b\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0451 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432 PSQL. \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>TSumArgsFunction<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IExternalFunction. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>IExternalFunctionImpl<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 dispose \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432 \u043d\u0451\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 getCharSet \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 execute \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u043c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438, \u0442\u043e \u044d\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0430\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0438\u043f\u043e\u043c BLOB. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u043e\u043c BLOB, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u044e\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0448\u0438\u0440\u0438\u043d\u044b, \u0447\u043b\u0435\u043d\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u043b\u0435\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0438\u0434\u0451\u0442 \u0447\u043b\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f NULL (\u0434\u0430\u043b\u0435\u0435 Null \u0444\u043b\u0430\u0433). \u041f\u043e\u043c\u0438\u043c\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0439 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u0445, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IMessageMetadata. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u044f\u0441\u043d\u0438\u043c \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 execute.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043c\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043d\u0435 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c. \u0414\u043b\u044f<br \/>  \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Null \u0444\u043b\u0430\u0433 \u0440\u0430\u0432\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e Null \u0444\u043b\u0430\u0433\u043e\u0432<br \/>  \u0443 \u0432\u0441\u0435\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0440\u0430\u0432\u0435\u043d NULL, \u0442\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435<br \/>  \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e \u0441\u0443\u043c\u043c\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/p>\n<p>  <\/p>\n<h3 id=\"realizaciya-vneshney-procedury\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0448 UDR \u043c\u043e\u0434\u0443\u043b\u044c \u0445\u0440\u0430\u043d\u0438\u043c\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443. \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u043e\u0432: \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0443\u044e \u0445\u0440\u0430\u043d\u0438\u043c\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443, \u0442.\u0435. \u0442\u0430\u043a\u0443\u044e \u0445\u0440\u0430\u043d\u0438\u043c\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 EXECUTE PROCEDURE \u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u0432 \u043c\u043e\u0434\u0443\u043b\u044c UdrInit \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>firebird_udr_plugin<\/code> \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl; begin   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   AUdrPlugin.registerFunction(AStatus, 'sum_args',     TSumArgsFunctionFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b   AUdrPlugin.registerProcedure(AStatus, 'sum_args_proc',     TSumArgsProcedureFactory.Create());   \/\/AUdrPlugin.registerProcedure(AStatus, 'gen_rows', TGenRowsFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b   \/\/AUdrPlugin.registerTrigger(AStatus, 'test_trigger',   \/\/  TMyTriggerFactory.Create());    theirUnloadFlag := AUnloadFlagLocal;   Result := @myUnloadFlag; end;<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441 \u0441\u043f\u0438\u0441\u043e\u043a uses \u043c\u043e\u0434\u0443\u043b\u044c SumArgsProc, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430.<\/p><\/blockquote>\n<p>\u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IUdrProcedureFactory. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 IUdrProcedureFactoryImpl. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043d\u0443\u0436\u043d\u0430 \u0441\u0432\u043e\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432. \u041f\u043e\u0437\u0436\u0435 \u043c\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 dispose \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438, \u0432 \u043d\u0451\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 setup \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432 \u043a\u0435\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043d\u0451\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0451\u043c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 newItem \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e IRoutineMetadata \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0442\u0435\u043b\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0451 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432 PSQL. \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b <code>TSumArgsProcedure<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0431\u0440\u0438\u043a\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0430\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 SumArgsProc.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u044f SumArgsProc<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">unit SumArgsProc;  {$IFDEF FPC} {$MODE DELPHI}{$H+} {$ENDIF}  interface  uses   Firebird;    { **********************************************************      create procedure sp_sum_args (       n1 integer,       n2 integer,       n3 integer     ) returns (result integer)     external name 'myudr!sum_args_proc'     engine udr;      ********************************************************* } type   \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435   TSumArgsInMsg = record     n1: Integer;     n1Null: WordBool;     n2: Integer;     n2Null: WordBool;     n3: Integer;     n3Null: WordBool;   end;   PSumArgsInMsg = ^TSumArgsInMsg;    \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435   TSumArgsOutMsg = record     result: Integer;     resultNull: WordBool;   end;   PSumArgsOutMsg = ^TSumArgsOutMsg;    \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b TSumArgsProcedure   TSumArgsProcedureFactory = class(IUdrProcedureFactoryImpl)     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438     procedure dispose(); override;      { \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432 \u043a\u0435\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445       \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b)       @param(AInBuilder \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)       @param(AOutBuilder \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)     }     procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AInBuilder: IMetadataBuilder;       AOutBuilder: IMetadataBuilder); override;      { \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b TSumArgsProcedure        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b)       @returns(\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b)     }     function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalProcedure; override;   end;    TSumArgsProcedure = class(IExternalProcedureImpl)   public     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b     procedure dispose(); override;      { \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 open \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442       \u044f\u0434\u0440\u0443 \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438       \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432,       \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 ExternalEngine::getCharSet.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AName \u0418\u043c\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)       @param(AName \u0414\u043b\u0438\u043d\u0430 \u0438\u043c\u0435\u043d\u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)     }     procedure getCharSet(AStatus: IStatus; AContext: IExternalContext;       AName: PAnsiChar; ANameSize: Cardinal); override;      { \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AInMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)       @param(AOutMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)       @returns(\u041d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u0435\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u043b\u0438                nil \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f)     }     function open(AStatus: IStatus; AContext: IExternalContext; AInMsg: Pointer;       AOutMsg: Pointer): IExternalResultSet; override;   end;  implementation  { TSumArgsProcedureFactory }  procedure TSumArgsProcedureFactory.dispose; begin   Destroy; end;  function TSumArgsProcedureFactory.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalProcedure; begin   Result := TSumArgsProcedure.create; end;  procedure TSumArgsProcedureFactory.setup(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata; AInBuilder,   AOutBuilder: IMetadataBuilder); begin  end;  { TSumArgsProcedure }  procedure TSumArgsProcedure.dispose; begin   Destroy; end;  procedure TSumArgsProcedure.getCharSet(AStatus: IStatus;   AContext: IExternalContext; AName: PAnsiChar; ANameSize: Cardinal); begin  end;  function TSumArgsProcedure.open(AStatus: IStatus; AContext: IExternalContext;   AInMsg, AOutMsg: Pointer): IExternalResultSet; var   xInput: PSumArgsInMsg;   xOutput: PSumArgsOutMsg; begin   Result := nil;   \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c   xInput := PSumArgsInMsg(AInMsg);   xOutput := PSumArgsOutMsg(AOutMsg);   \/\/ \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 NULL \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 NULL   xOutput^.resultNull := xInput^.n1Null or xInput^.n2Null or xInput^.n3Null;   xOutput^.result := xInput^.n1 + xInput^.n2 + xInput^.n3; end;  end.<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u044f\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IExternalProcedure. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>IExternalProcedureImpl<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 dispose \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0432 \u043d\u0451\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 getCharSet \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 open \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 nil, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u0430\u0431\u043e\u0440\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 TSumArgsFunction.execute.<\/p>\n<p>  <\/p>\n<h3 id=\"hranimaya-procedura-vybora\">\u0425\u0440\u0430\u043d\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0432\u044b\u0431\u043e\u0440\u0430<\/h3>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448 UDR \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0432\u044b\u0431\u043e\u0440\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 <code>firebird_udr_plugin<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl; begin   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   AUdrPlugin.registerFunction(AStatus, 'sum_args',     TSumArgsFunctionFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b   AUdrPlugin.registerProcedure(AStatus, 'sum_args_proc',     TSumArgsProcedureFactory.Create());   AUdrPlugin.registerProcedure(AStatus, 'gen_rows', TGenRowsFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b   \/\/AUdrPlugin.registerTrigger(AStatus, 'test_trigger',   \/\/  TMyTriggerFactory.Create());    theirUnloadFlag := AUnloadFlagLocal;   Result := @myUnloadFlag; end;<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441 \u0441\u043f\u0438\u0441\u043e\u043a uses \u043c\u043e\u0434\u0443\u043b\u044c GenRowsProc, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430.<\/p><\/blockquote>\n<p>\u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0430 \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043e\u0439. \u041c\u0435\u0442\u043e\u0434\u044b \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0442\u043e\u0436\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0430 open, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u044f GenRowsProc<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">unit GenRowsProc;  {$IFDEF FPC} {$MODE DELPHI}{$H+} {$ENDIF}  interface  uses   Firebird, SysUtils;  type   { **********************************************************      create procedure gen_rows (       start  integer,       finish integer     ) returns (n integer)     external name 'myudr!gen_rows'     engine udr;      ********************************************************* }    TInput = record     start: Integer;     startNull: WordBool;     finish: Integer;     finishNull: WordBool;   end;   PInput = ^TInput;    TOutput = record     n: Integer;     nNull: WordBool;   end;   POutput = ^TOutput;    \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b TGenRowsProcedure   TGenRowsFactory = class(IUdrProcedureFactoryImpl)     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438     procedure dispose(); override;      { \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043a\u0435\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445.       \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AInBuilder \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)       @param(AOutBuilder \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)     }     procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AInBuilder: IMetadataBuilder;       AOutBuilder: IMetadataBuilder); override;      { \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b TGenRowsProcedure        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @returns(\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)     }     function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalProcedure; override;   end;    \/\/ \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 TGenRowsProcedure.   TGenRowsProcedure = class(IExternalProcedureImpl)   public     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b     procedure dispose(); override;      { \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 open \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442       \u044f\u0434\u0440\u0443 \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438       \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432,       \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 ExternalEngine::getCharSet.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AName \u0418\u043c\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)       @param(AName \u0414\u043b\u0438\u043d\u0430 \u0438\u043c\u0435\u043d\u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)     }     procedure getCharSet(AStatus: IStatus; AContext: IExternalContext;       AName: PAnsiChar; ANameSize: Cardinal); override;      { \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AInMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)       @param(AOutMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)       @returns(\u041d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u0435\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u043b\u0438                nil \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f)     }     function open(AStatus: IStatus; AContext: IExternalContext; AInMsg: Pointer;       AOutMsg: Pointer): IExternalResultSet; override;   end;    \/\/ \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b TGenRowsProcedure   TGenRowsResultSet = class(IExternalResultSetImpl)     Input: PInput;     Output: POutput;      \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445     procedure dispose(); override;      { \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.       \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u043e\u0434\u0435 \u0430\u043d\u0430\u043b\u043e\u0433 SUSPEND. \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0434\u043e\u043b\u0436\u043d\u0430       \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @returns(True \u0435\u0441\u043b\u0438 \u0432 \u043d\u0430\u0431\u043e\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f,                False \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c)     }     function fetch(AStatus: IStatus): Boolean; override;   end;  implementation  { TGenRowsFactory }  procedure TGenRowsFactory.dispose; begin   Destroy; end;  function TGenRowsFactory.newItem(AStatus: IStatus; AContext: IExternalContext;   AMetadata: IRoutineMetadata): IExternalProcedure; begin   Result := TGenRowsProcedure.create; end;  procedure TGenRowsFactory.setup(AStatus: IStatus; AContext: IExternalContext;   AMetadata: IRoutineMetadata; AInBuilder, AOutBuilder: IMetadataBuilder); begin  end;  { TGenRowsProcedure }  procedure TGenRowsProcedure.dispose; begin   Destroy; end;  procedure TGenRowsProcedure.getCharSet(AStatus: IStatus;   AContext: IExternalContext; AName: PAnsiChar; ANameSize: Cardinal); begin  end;  function TGenRowsProcedure.open(AStatus: IStatus; AContext: IExternalContext;   AInMsg, AOutMsg: Pointer): IExternalResultSet; begin   \/\/ \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 NULL \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c   if PInput(AInMsg).startNull or PInput(AInMsg).finishNull then   begin     POutput(AOutMsg).nNull := True;     Result := nil;     exit;   end;   \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438   if PInput(AInMsg).start &gt; PInput(AInMsg).finish then     raise Exception.Create('First parameter greater then second parameter.');    Result := TGenRowsResultSet.create;   with TGenRowsResultSet(Result) do   begin     Input := AInMsg;     Output := AOutMsg;     \/\/ \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435     Output.nNull := False;     Output.n := Input.start - 1;   end; end;  { TGenRowsResultSet }  procedure TGenRowsResultSet.dispose; begin   Destroy; end;  \/\/ \u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True \u0442\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \/\/ \u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 False \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043d\u0430\u0431\u043e\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c \/\/ \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \/\/ \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 function TGenRowsResultSet.fetch(AStatus: IStatus): Boolean; begin   Inc(Output.n);   Result := (Output.n &lt;= Input.finish); end;  end.<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 open \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b <code>TGenRowsProcedure<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 NULL, \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0432\u0435\u043d NULL, \u0442\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d NULL, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 SELECT, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 nil.<\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0440\u043e\u0441\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041d\u0435 \u0432\u043e\u043b\u043d\u0443\u0439\u0442\u0435\u0441\u044c \u044d\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u043e \u0432 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0435 UDR \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043e \u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e Firebird. \u042d\u0442\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u043d\u043e\u0432\u044b\u0445 UDR \u043f\u0435\u0440\u0435\u0434 Legacy UDF. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0432\u044b\u0431\u043e\u0440\u0430, \u0442\u043e \u043c\u0435\u0442\u043e\u0434 open \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IExternalResultSet. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <code>IExternalResultSetImpl<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 dispose \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0412 \u043d\u0451\u043c \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 fetch \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c SELECT. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 SUSPEND \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 PSQL \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u0445. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043d\u0451\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u0438 <code>false<\/code>, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u043d\u043e \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0412 Delphi \u043d\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 yeild, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u0432\u0430\u0441 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0432\u0440\u043e\u0434\u0435  <\/p>\n<pre><code class=\"cpp\">while(...) do {   ...   yield result; }<\/code><\/pre>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 open, \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0432 fetch. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b \u043b\u0438\u0448\u0430\u0435\u0442\u0435\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0440\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b (\u043d\u0435\u043f\u043e\u043b\u043d\u044b\u0439 \u0444\u0435\u0442\u0447 \u0432 SELECT \u0438\u043b\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b\u0438 FIRST\/ROWS\/FETCH FIRST \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0435 SELECT.)<\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"realizaciya-vneshnego-triggera\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430<\/h3>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448 UDR \u043c\u043e\u0434\u0443\u043b\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>Note<\/strong><\/p>\n<p>  \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043d\u0430 C++ \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437\u043b\u0438\u0448\u043d\u0435 \u0441\u043b\u043e\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430\u043c\u0438. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043a \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0431\u0430\u0437\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043f\u043e\u0437\u0436\u0435.<\/p><\/blockquote>\n<p>\u0412\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u0432 \u043c\u043e\u0434\u0443\u043b\u044c UdrInit \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>firebird_udr_plugin<\/code> \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl; begin   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   AUdrPlugin.registerFunction(AStatus, 'sum_args',     TSumArgsFunctionFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b   AUdrPlugin.registerProcedure(AStatus, 'sum_args_proc',     TSumArgsProcedureFactory.Create());   AUdrPlugin.registerProcedure(AStatus, 'gen_rows', TGenRowsFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b   AUdrPlugin.registerTrigger(AStatus, 'test_trigger',     TMyTriggerFactory.Create());    theirUnloadFlag := AUnloadFlagLocal;   Result := @myUnloadFlag; end;<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441 \u0441\u043f\u0438\u0441\u043e\u043a uses \u043c\u043e\u0434\u0443\u043b\u044c TestTrigger, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u043d\u0430\u0448 \u0442\u0440\u0438\u0433\u0433\u0435\u0440.<\/p><\/blockquote>\n<p>\u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IUdrTriggerFactory. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 IUdrTriggerFactoryImpl. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043d\u0443\u0436\u043d\u0430 \u0441\u0432\u043e\u044f<br \/>  \u0444\u0430\u0431\u0440\u0438\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 dispose \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438, \u0432 \u043d\u0451\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 setup \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0432 \u043a\u0435\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043d\u0451\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0451\u043c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 newItem \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e IRoutineMetadata \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u0435\u0439, \u0442\u0435\u043b\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432 PSQL. \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 <code>TMyTrigger<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0431\u0440\u0438\u043a\u0443 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0430\u043c \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 TestTrigger.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u044f TestTrigger<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">unit TestTrigger;  {$IFDEF FPC} {$MODE DELPHI}{$H+} {$ENDIF}  interface  uses   Firebird, SysUtils;  type   { **********************************************************     create table test (       id int generated by default as identity,       a int,       b int,       name varchar(100),       constraint pk_test primary key(id)     );      create or alter trigger tr_test_biu for test     active before insert or update position 0     external name 'myudr!test_trigger'     engine udr;   }    \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 NEW.* \u0438 OLD.*   \/\/ \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440\u0443 \u043f\u043e\u043b\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b test   TFieldsMessage = record     Id: Integer;     IdNull: WordBool;     A: Integer;     ANull: WordBool;     B: Integer;     BNull: WordBool;     Name: record       Length: Word;       Value: array [0 .. 399] of AnsiChar;     end;     NameNull: WordBool;   end;    PFieldsMessage = ^TFieldsMessage;    \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 TMyTrigger   TMyTriggerFactory = class(IUdrTriggerFactoryImpl)     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438     procedure dispose(); override;      { \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0432 \u043a\u0435\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445.       \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430)       @param(AFieldsBuilder \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b)     }     procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AFieldsBuilder: IMetadataBuilder); override;      { \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 TMyTrigger        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430)       @returns(\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430)     }     function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalTrigger; override;   end;    TMyTrigger = class(IExternalTriggerImpl)     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430     procedure dispose(); override;      { \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 execute \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442       \u044f\u0434\u0440\u0443 \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438       \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432,       \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 ExternalEngine::getCharSet.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430)       @param(AName \u0418\u043c\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)       @param(AName \u0414\u043b\u0438\u043d\u0430 \u0438\u043c\u0435\u043d\u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)     }     procedure getCharSet(AStatus: IStatus; AContext: IExternalContext;        AName: PAnsiChar; ANameSize: Cardinal); override;      { \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 TMyTrigger        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430)       @param(AAction \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435) \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430)       @param(AOldMsg \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 :OLD.*)       @param(ANewMsg \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 :NEW.*)     }     procedure execute(AStatus: IStatus; AContext: IExternalContext;       AAction: Cardinal; AOldMsg: Pointer; ANewMsg: Pointer); override;   end;  implementation  { TMyTriggerFactory }  procedure TMyTriggerFactory.dispose; begin   Destroy; end;  function TMyTriggerFactory.newItem(AStatus: IStatus; AContext: IExternalContext;   AMetadata: IRoutineMetadata): IExternalTrigger; begin   Result := TMyTrigger.create; end;  procedure TMyTriggerFactory.setup(AStatus: IStatus; AContext: IExternalContext;   AMetadata: IRoutineMetadata; AFieldsBuilder: IMetadataBuilder); begin  end;  { TMyTrigger }  procedure TMyTrigger.dispose; begin   Destroy; end;  procedure TMyTrigger.execute(AStatus: IStatus; AContext: IExternalContext;   AAction: Cardinal; AOldMsg, ANewMsg: Pointer); var   xOld, xNew: PFieldsMessage; begin   \/\/ xOld := PFieldsMessage(AOldMsg);   xNew := PFieldsMessage(ANewMsg);   case AAction of     IExternalTrigger.ACTION_INSERT:       begin         if xNew.BNull and not xNew.ANull then         begin           xNew.B := xNew.A + 1;           xNew.BNull := False;         end;       end;      IExternalTrigger.ACTION_UPDATE:       begin         if xNew.BNull and not xNew.ANull then         begin           xNew.B := xNew.A + 1;           xNew.BNull := False;         end;       end;      IExternalTrigger.ACTION_DELETE:       begin        end;   end; end;  procedure TMyTrigger.getCharSet(AStatus: IStatus; AContext: IExternalContext;   AName: PAnsiChar; ANameSize: Cardinal); begin  end;  end.<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IExternalTrigger. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>IExternalTriggerImpl<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 dispose \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430, \u0432 \u043d\u0451\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 getCharSet \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0443 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 execute \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e \u0438\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d \u0442\u0440\u0438\u0433\u0433\u0435\u0440. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 (\u0441\u043e\u0431\u044b\u0442\u0438\u0435) \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u044b\u0445 \u0438 \u043d\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u0435\u0439. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u0441\u043e\u0431\u044b\u0442\u0438\u044f) \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 IExternalTrigger. \u0422\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 <code>ACTION_<\/code>. \u0417\u043d\u0430\u043d\u0438\u044f \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 Firebird \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0440\u0430\u0437\u0443. \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0434\u043b\u044f DDL \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432, \u0430 \u0434\u043b\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043e\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043a\u0430\u0442\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c nil. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u043d \u0442\u0440\u0438\u0433\u0433\u0435\u0440. \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c, \u0447\u0442\u043e \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043f\u043e\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u043e \u0432\u0430\u0448\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043b\u043e\u043c\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u0430 \u043f\u043e\u043b\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0438\u0445 \u0442\u0438\u043f\u043e\u0432. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0435 \u0438\u0437 IMessageMetadata. \u042d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0447\u0430\u0441\u0442\u043e. \u0418\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u044d\u0442\u043e \u044f\u0432\u043d\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c \u0432\u0430\u0441 \u043d\u0430 \u043c\u044b\u0441\u043b\u044c, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443\/\u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p><\/blockquote>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0438 \u0432 \u0442\u0435\u043b\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 PSQL \u0430\u043d\u0430\u043b\u043e\u0433<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">  if (:new.B IS NULL) THEN     :new.B = :new.A + 1;<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"soobscheniya\">\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u0432 UDR \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 NEW \u0438 OLD.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0438\u043b\u0438 \u043f\u043e\u043b\u044f\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0442\u0438\u043f \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<br \/>  \u041a\u0430\u043a \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0431\u0443\u0444\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (\u0432 Delphi \u044d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c, \u0442.\u0435. record);<\/p>\n<p>  <\/li>\n<li>\n<p>\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IMessageMetadata, \u0438 \u0447\u0442\u0435\u043d\u0438\u0435\/\u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0442\u0438\u043f\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043b\u0438 \u043f\u043e\u043b\u044f.<\/p>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u043c, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0440\u044f\u0434\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0438\u043f\u044b \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043f\u043e\u043b\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 UDR.<\/p>\n<p>  <\/p>\n<h3 id=\"rabota-s-buferom-soobscheniya-s-ispolzovaniem-struktury\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432\u044b\u0448\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0422\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">TMyStruct = record   &lt;var_1&gt;: &lt;type_1&gt;;   &lt;nullIndicator_1&gt;: WordBool;   &lt;var_2&gt;: &lt;type_1&gt;;   &lt;nullIndicator_2&gt;: WordBool;   ...   &lt;var_N&gt;: &lt;type_1&gt;;   &lt;nullIndicator_N&gt;: WordBool; end; PMyStruct = ^TMyStruct;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0438\u043f\u044b \u0447\u043b\u0435\u043d\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u0430\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0445\/\u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043f\u043e\u043b\u0435\u0439 (\u0434\u043b\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432). Null-\u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\/\u043f\u043e\u043b\u044f, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 NOT NULL. Null-\u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 2 \u0431\u0430\u0439\u0442\u0430. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 -1 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0442\u043e<br \/>  \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f\/\u043f\u043e\u043b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 NULL. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 NULL-\u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a NULL, \u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 2-\u0445 \u0431\u0430\u0439\u0442\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f. \u0422\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 SQL \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<tr>\n<th> SQL \u0442\u0438\u043f <\/th>\n<th> Delphi \u0442\u0438\u043f <\/th>\n<th> \u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 <\/th>\n<\/tr>\n<tr>\n<td> BOOLEAN <\/td>\n<td> Boolean, ByteBool <\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td> SMALLINT <\/td>\n<td> Smallint <\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td> INTEGER <\/td>\n<td> Integer <\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td> BIGINT <\/td>\n<td> Int64 <\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td> FLOAT <\/td>\n<td> Single <\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td> DOUBLE PRECISION <\/td>\n<td> Double <\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td> NUMERIC(N, M) <\/td>\n<td> \u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0430:  <\/p>\n<ul>\n<li>1-4 \u2014 Smallint;<\/li>\n<li>5-9 \u2014 Integer;<\/li>\n<li>10-18 (3 \u0434\u0438\u0430\u043b\u0435\u043a\u0442) \u2014 Int64;<\/li>\n<li>10-15 (1 \u0434\u0438\u0430\u043b\u0435\u043a\u0442) \u2014 Double.<\/li>\n<\/ul>\n<p>   <\/td>\n<td>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0447\u0438\u0441\u043b\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/925\/28b\/8bf\/92528b8bfc17bd51c36e674d1105c22d.svg\" alt=\"$10^M$\" data-tex=\"inline\"><\/math>. <\/td>\n<\/tr>\n<tr>\n<td> DECIMAL(N, M) <\/td>\n<td> \u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0430:  <\/p>\n<ul>\n<li>1-4 \u2014 Integer;<\/li>\n<li>5-9 \u2014 Integer;<\/li>\n<li>10-18 (3 \u0434\u0438\u0430\u043b\u0435\u043a\u0442) \u2014 Int64;<\/li>\n<li>10-15 (1 \u0434\u0438\u0430\u043b\u0435\u043a\u0442) \u2014 Double.<\/li>\n<\/ul>\n<p>   <\/td>\n<td>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0447\u0438\u0441\u043b\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/925\/28b\/8bf\/92528b8bfc17bd51c36e674d1105c22d.svg\" alt=\"$10^M$\" data-tex=\"inline\"><\/math>. <\/td>\n<\/tr>\n<tr>\n<td> CHAR(N) <\/td>\n<td> array[0\u2026 M] of AnsiChar <\/td>\n<td>M \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/709\/81c\/4e3\/70981c4e361483a1eac001a56f3303af.svg\" alt=\"$M = N * BytesPerChar - 1$\" data-tex=\"inline\"><\/math>,<br \/>   \u0433\u0434\u0435 BytesPerChar \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\/\u043f\u043e\u043b\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f UTF-8 \u2014 \u044d\u0442\u043e 4 \u0431\u0430\u0439\u0442\/\u0441\u0438\u043c\u0432\u043e\u043b, \u0434\u043b\u044f WIN1251 \u2014 1 \u0431\u0430\u0439\u0442\/\u0441\u0438\u043c\u0432\u043e\u043b.<\/td>\n<\/tr>\n<tr>\n<td> VARCHAR(N) <\/td>\n<td> FbVarChar&lt;N&gt; <\/td>\n<td>M \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/709\/81c\/4e3\/70981c4e361483a1eac001a56f3303af.svg\" alt=\"$M = N * BytesPerChar - 1$\" data-tex=\"inline\"><\/math>,<br \/>   \u0433\u0434\u0435 BytesPerChar \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\/\u043f\u043e\u043b\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f UTF-8 \u2014 \u044d\u0442\u043e 4 \u0431\u0430\u0439\u0442\/\u0441\u0438\u043c\u0432\u043e\u043b, \u0434\u043b\u044f WIN1251 \u2014 1 \u0431\u0430\u0439\u0442\/\u0441\u0438\u043c\u0432\u043e\u043b. \u0412 Length \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u0445. \u0412 Delphi \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0449\u043d\u0430\u044f \u043a\u0430\u043a \u0432 C++,<br \/>  \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 FbVarChar&lt;N&gt; \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e<br \/>  \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c. \u041d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043a\u043e\u0434.<\/td>\n<\/tr>\n<tr>\n<td> DATE <\/td>\n<td> ISC_DATE <\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td> TIME <\/td>\n<td> ISC_TIME <\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td> TIMESTAMP <\/td>\n<td> ISC_TIMESTAMP <\/td>\n<td>\u0422\u0438\u043f ISC_TIMESTAMP \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0432 Firebird.pas, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u0430\u043c\u0438. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043a\u043e\u0434 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/td>\n<\/tr>\n<tr>\n<td> BLOB <\/td>\n<td> ISC_QUAD <\/td>\n<td>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 BLOB \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f BlobId. \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0442\u0438\u043f\u043e\u043c BLOB \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u0437\u0436\u0435.<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>  <\/p>\n<pre><code class=\"delphi\">\/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u043e\u043c VARCHAR(N) \/\/ M = N * BytesPerChar - 1 record      Length: Smallint;      Data: array[0 .. M] of AnsiChar; end;  \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u043e\u043c TIMESTAMP ISC_TIMESTAMP = record     date: ISC_DATE;     time: ISC_TIME; end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b<br \/>  \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">function SUM_ARGS(A SMALLINT, B INTEGER) RETURNS BIGINT ....<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c<br \/>  \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">TInput = record   A: Smallint;   ANull: WordBool;   B: Integer;   BNull: WordBool; end; PInput = ^TInput;  TOutput = record   Value: Int64;   Null: WordBool; end; POutput = ^TOutput;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0430 \u0436\u0435 \u0441\u0430\u043c\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 (\u0432 3 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0435):<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">function SUM_ARGS(A NUMERIC(4, 2), B NUMERIC(9, 3)) RETURNS NUMERIC(18, 6) ....<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c<br \/>  \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">TInput = record   A: Smallint;   ANull: WordBool;   B: Integer;   BNull: WordBool; end; PInput = ^TInput;  TOutput = record   Value: Int64;   Null: WordBool; end; POutput = ^TOutput;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">procedure SOME_PROC(A CHAR(3) CHARACTER SET WIN1251, B VARCHAR(10) CHARACTER SET UTF8) ....<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">TInput = record   A: array[0..2] of AnsiChar;   ANull: WordBool;   B: record     Length: Smallint;     Value: array[0..39] of AnsiChar;   end;   BNull: WordBool; end; PInput = ^TInput;<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"rabota-s-buferom-soobscheniy-s-pomoschyu-imessagemetadata\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e IMessageMetadata<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435 \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441<br \/>  \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<br \/>  IMessageMetadata. \u042d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\/\u043f\u043e\u043b\u0435<br \/>  \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\/\u043f\u043e\u043b\u044f;<\/li>\n<li>\u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445;<\/li>\n<li>\u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445;<\/li>\n<li>\u043f\u043e\u0434\u0442\u0438\u043f \u0434\u043b\u044f \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 BLOB;<\/li>\n<li>\u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445 \u043f\u043e\u0434 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\/\u043f\u043e\u043b\u0435;<\/li>\n<li>\u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f\/\u043f\u043e\u043b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 NULL;<\/li>\n<li>\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445;<\/li>\n<li>\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f NULL-\u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<h4 id=\"metody-interfeysa-imessagemetadata\">\u041c\u0435\u0442\u043e\u0434\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IMessageMetadata<\/h4>\n<p>  <\/p>\n<ol>\n<li>\n<p>getCount<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">unsigned getCount(StatusType* status)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0435\u0439\/\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438. \u0412\u043e \u0432\u0441\u0435\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c: 0 &lt;= index &lt; getCount().<\/p>\n<p>  <\/li>\n<li>\n<p>getField<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">const char* getField(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u043e\u043b\u044f.<\/p>\n<p>  <\/li>\n<li>\n<p>getRelation<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">const char* getRelation(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f (\u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435).<\/p>\n<p>  <\/li>\n<li>\n<p>getOwner<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">const char* getOwner(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/li>\n<li>\n<p>getAlias<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">const char* getAlias(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043f\u043e\u043b\u044f.<\/p>\n<p>  <\/li>\n<li>\n<p>getType<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">unsigned getType(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 SQL \u0442\u0438\u043f \u043f\u043e\u043b\u044f.<\/p>\n<p>  <\/li>\n<li>\n<p>isNullable<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">FB_BOOLEAN isNullable(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 NULL.<\/p>\n<p>  <\/li>\n<li>\n<p>getSubType<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">int getSubType(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u0442\u0438\u043f \u043f\u043e\u043b\u044f BLOB (0 \u2014 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439, 1 \u2014 \u0442\u0435\u043a\u0441\u0442 \u0438 \u0442. \u0434.).<\/p>\n<p>  <\/li>\n<li>\n<p>getLength<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">unsigned getLength(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u043f\u043e\u043b\u044f \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.<\/p>\n<p>  <\/li>\n<li>\n<p>getScale<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">int getScale(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0434\u043b\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.<\/p>\n<p>  <\/li>\n<li>\n<p>getCharSet<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">unsigned getCharSet(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e BLOB.<\/p>\n<p>  <\/li>\n<li>\n<p>getOffset<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">unsigned getOffset(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0433\u043e \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439).<\/p>\n<p>  <\/li>\n<li>\n<p>getNullOffset<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">unsigned getNullOffset(StatusType* status, unsigned index)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 NULL \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/li>\n<li>\n<p>getBuilder<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">IMetadataBuilder* getBuilder(StatusType* status)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IMetadataBuilder, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/li>\n<li>\n<p>getMessageLength<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">unsigned getMessageLength(StatusType* status)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u0431\u0443\u0444\u0435\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0433\u043e \u0434\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u0431\u0443\u0444\u0435\u0440).<\/p>\n<p>  <\/li>\n<\/ol>\n<p>  <\/p>\n<h4 id=\"poluchenie-i-ispolzovanie-imessagemetadata\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 IMessageMetadata<\/h4>\n<p>  <\/p>\n<p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IMessageMetadata \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IRoutineMetadata. \u041e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044f\u0432\u043d\u043e \u0432 \u0444\u0430\u0431\u0440\u0438\u043a\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c RoutineMetadata<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">  \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 TSumArgsFunction   TSumArgsFunctionFactory = class(IUdrFunctionFactoryImpl)     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438     procedure dispose(); override;      { \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043a\u0435\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AInBuilder \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)       @param(AOutBuilder \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)     }     procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AInBuilder: IMetadataBuilder;       AOutBuilder: IMetadataBuilder); override;      { \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 TSumArgsFunction        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AMetadata \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @returns(\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)     }     function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalFunction; override;   end;    \/\/ \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f TSumArgsFunction.   TSumArgsFunction = class(IExternalFunctionImpl)   private     FMetadata: IRoutineMetadata;   public     property Metadata: IRoutineMetadata read FMetadata write FMetadata;   public     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438     procedure dispose(); override;      { \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 execute \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442       \u044f\u0434\u0440\u0443 \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438       \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432,       \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 ExternalEngine::getCharSet.        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AName \u0418\u043c\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)       @param(AName \u0414\u043b\u0438\u043d\u0430 \u0438\u043c\u0435\u043d\u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)     }     procedure getCharSet(AStatus: IStatus; AContext: IExternalContext;       AName: PAnsiChar; ANameSize: Cardinal); override;      { \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AInMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)       @param(AOutMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)     }     procedure execute(AStatus: IStatus; AContext: IExternalContext;       AInMsg: Pointer; AOutMsg: Pointer); override;   end; ........................  { TSumArgsFunctionFactory }  procedure TSumArgsFunctionFactory.dispose; begin   Destroy; end;  function TSumArgsFunctionFactory.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalFunction; begin   Result := TSumArgsFunction.Create();   with Result as TSumArgsFunction do   begin     Metadata := AMetadata;   end; end;  procedure TSumArgsFunctionFactory.setup(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata;   AInBuilder, AOutBuilder: IMetadataBuilder); begin  end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b IMessageMetadata \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 getInputMetadata \u0438 getOutputMetadata \u0438\u0437 IRoutineMetadata. \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0442\u0440\u0438\u0433\u0433\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 getTriggerMetadata.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0412\u0430\u0436\u043d\u043e<\/strong><\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IMessageMetadata \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0441\u0441\u044b\u043b\u043e\u043a. \u041e\u043d \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IReferenceCounted. \u041c\u0435\u0442\u043e\u0434\u044b getInputMetadata \u0438 getOutputMetadata \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 1 \u0434\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 <code>xInputMetadata<\/code> \u0438 <code>xOutputMetadata<\/code> \u0432\u044b\u0437\u0432\u0430\u0432 \u043c\u0435\u0442\u043e\u0434 release.<\/p><\/blockquote>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0439 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u043e\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 IMessageMetadata \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 getOffset \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u0430\u0434\u0440\u0435\u0441\u0443 \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430 \u0442\u0430\u043a\u0430\u044f \u0436\u0435<br \/>  \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f null \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 getNullOffset.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c IMessageMetadata<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">\/\/ ........................  procedure TSumArgsFunction.execute(AStatus: IStatus; AContext: IExternalContext;   AInMsg, AOutMsg: Pointer); var   n1, n2, n3: Integer;   n1Null, n2Null, n3Null: WordBool;   Result: Integer;   resultNull: WordBool;   xInputMetadata, xOutputMetadata: IMessageMetadata; begin   xInputMetadata := FMetadata.getInputMetadata(AStatus);   xOutputMetadata := FMetadata.getOutputMetadata(AStatus);   try     \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0438\u0445 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u043c     n1 := PInteger(PByte(AInMsg) + xInputMetadata.getOffset(AStatus, 0))^;     n2 := PInteger(PByte(AInMsg) + xInputMetadata.getOffset(AStatus, 1))^;     n3 := PInteger(PByte(AInMsg) + xInputMetadata.getOffset(AStatus, 2))^;     \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f null-\u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0438\u0445 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u043c     n1Null := PWordBool(PByte(AInMsg) +       xInputMetadata.getNullOffset(AStatus, 0))^;     n2Null := PWordBool(PByte(AInMsg) +       xInputMetadata.getNullOffset(AStatus, 1))^;     n3Null := PWordBool(PByte(AInMsg) +       xInputMetadata.getNullOffset(AStatus, 2))^;     \/\/ \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0430\u0440\u0433\u0435\u043c\u0435\u043d\u0442 = NULL, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u043c\u0443 nullFlag     resultNull := True;     Result := 0;     \/\/ \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 NULL \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 NULL     \/\/ \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432     if not(n1Null or n2Null or n3Null) then     begin       Result := n1 + n2 + n3;       \/\/ \u0440\u0430\u0437 \u0435\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0442\u043e \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c NULL \u0444\u043b\u0430\u0433       resultNull := False;     end;     PWordBool(PByte(AInMsg) + xOutputMetadata.getNullOffset(AStatus, 0))^ :=       resultNull;     PInteger(PByte(AInMsg) + xOutputMetadata.getOffset(AStatus, 0))^ := Result;   finally     xInputMetadata.release;     xOutputMetadata.release;   end; end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h2 id=\"fabriki\">\u0424\u0430\u0431\u0440\u0438\u043a\u0438<\/h2>\n<p>  <\/p>\n<p>\u0412\u044b \u0443\u0436\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441 \u0444\u0430\u0431\u0440\u0438\u043a\u0430\u043c\u0438 \u0440\u0430\u043d\u0435\u0435. \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0431\u0440\u0438\u043a\u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432. \u041a\u043b\u0430\u0441\u0441 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 IUdrProcedureFactory, IUdrFunctionFactory \u0438\u043b\u0438 IUdrTriggerFactory \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 UDR. \u0418\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 UDR \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>firebird_udr_plugin<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl; begin   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e   AUdrPlugin.registerFunction(AStatus, 'sum_args',     TSumArgsFunctionFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443   AUdrPlugin.registerProcedure(AStatus, 'gen_rows', TGenRowsFactory.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u0442\u0440\u0438\u0433\u0433\u0435\u0440   AUdrPlugin.registerTrigger(AStatus, 'test_trigger',     TMyTriggerFactory.Create());    theirUnloadFlag := AUnloadFlagLocal;   Result := @myUnloadFlag; end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043b\u0430\u0441\u0441 <code>TSumArgsFunctionFactory<\/code> \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IUdrFunctionFactory, <code>TGenRowsFactory<\/code> \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IUdrProcedureFactory, \u0430 <code>TMyTriggerFactory<\/code> \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IUdrTriggerFactory.<\/p>\n<p>  <\/p>\n<p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0444\u0430\u0431\u0440\u0438\u043a \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a \u0442\u043e\u0447\u043a\u0430\u043c \u0432\u0445\u043e\u0434\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 Firebird. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b SuperServer \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430, \u0434\u043b\u044f Classic \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e<br \/>  \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043e \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0444\u0430\u0431\u0440\u0438\u043a \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b setup \u0438 newItem \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 IUdrProcedureFactory, IUdrFunctionFactory \u0438\u043b\u0438 IUdrTriggerFactory.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0444\u0430\u0431\u0440\u0438\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">  IUdrFunctionFactory = class(IDisposable)     const VERSION = 3;      procedure setup(status: IStatus; context: IExternalContext;       metadata: IRoutineMetadata; inBuilder: IMetadataBuilder;         outBuilder: IMetadataBuilder);      function newItem(status: IStatus; context: IExternalContext;       metadata: IRoutineMetadata): IExternalFunction;   end;    IUdrProcedureFactory = class(IDisposable)     const VERSION = 3;      procedure setup(status: IStatus; context: IExternalContext;       metadata: IRoutineMetadata; inBuilder: IMetadataBuilder;         outBuilder: IMetadataBuilder);      function newItem(status: IStatus; context: IExternalContext;       metadata: IRoutineMetadata): IExternalProcedure;   end;    IUdrTriggerFactory = class(IDisposable)     const VERSION = 3;      procedure setup(status: IStatus; context: IExternalContext;       metadata: IRoutineMetadata; fieldsBuilder: IMetadataBuilder);      function newItem(status: IStatus; context: IExternalContext;       metadata: IRoutineMetadata): IExternalTrigger;   end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDisposable, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0442\u0430\u043a \u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 dispose. \u042d\u0442\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0442\u043e Firebird \u0441\u0430\u043c \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442 \u0444\u0430\u0431\u0440\u0438\u043a\u0443, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 dispose \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0438. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0443\u0434\u043e\u0431\u043d\u043e<br \/>  \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 <code>IUdrProcedureFactoryImpl<\/code>, <code>IUdrFunctionFactoryImpl<\/code>, <code>IUdrTriggerFactoryImpl<\/code>. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e.<\/p>\n<p>  <\/p>\n<h3 id=\"metod-newitem\">\u041c\u0435\u0442\u043e\u0434 newItem<\/h3>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 newItem \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 UDR \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0451 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u043a\u044d\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0442.\u0435. \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u044d\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u041a\u044d\u0448 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u0438\u0445 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0432\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438, \u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0432\u0445\u043e\u0434\u0430, \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c\u0438 <code>IUdrFunctionFactory<\/code>. \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0438\u043c\u0435\u043d\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0438 \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0430. \u041a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434 newItem \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<br \/>  \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f UDR \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 UDR.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function TSumArgsFunctionFactory.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalFunction; begin   \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   Result := TSumArgsFunction.Create(); end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e IRoutineMetadata \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0442\u0435\u043b\u043e UDR \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 UDR. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0430\u0448\u0443 UDR \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">  \/\/ \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f TSumArgsFunction.   TSumArgsFunction = class(IExternalFunctionImpl)   private     FMetadata: IRoutineMetadata;   public     property Metadata: IRoutineMetadata read FMetadata write FMetadata;   public   ...   end;<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"metod-setup\">\u041c\u0435\u0442\u043e\u0434 setup<\/h3>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 setup \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f\u044b \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u043f\u043e\u043b\u0435\u0439 \u0434\u043b\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IMetadataBuilder, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442<br \/>  \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 setup, \u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0438\u0437 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 setup \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 DLL \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430. \u0422\u0438\u043f\u044b \u043f\u043e\u043b\u0435\u0439 \u0438\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u0443\u0442\u0451\u043c \u0438\u0445 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0438\u0439 \u0442\u0438\u043f. \u0411\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043f\u043e\u0437\u0436\u0435, \u0430 \u043f\u043e\u043a\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 SumArgs.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">type   \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435   TSumArgsInMsg = record     n1: Integer;     n1Null: WordBool;     n2: Integer;     n2Null: WordBool;     n3: Integer;     n3Null: WordBool;   end;    PSumArgsInMsg = ^TSumArgsInMsg;    \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435   TSumArgsOutMsg = record     result: Integer;     resultNull: WordBool;   end;    PSumArgsOutMsg = ^TSumArgsOutMsg;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 setup \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">SumArgsFunctionFactory<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">{ TSumArgsFunctionFactory }  procedure TSumArgsFunctionFactory.dispose; begin   Destroy; end;  function TSumArgsFunctionFactory.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalFunction; begin   Result := TSumArgsFunction.Create(); end;  procedure TSumArgsFunctionFactory.setup(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata;   AInBuilder, AOutBuilder: IMetadataBuilder); begin   \/\/ \u0441\u0442\u0440\u043e\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432   AInBuilder.setType(AStatus, 0, Cardinal(SQL_LONG) + 1);   AInBuilder.setLength(AStatus, 0, sizeof(Int32));   AInBuilder.setType(AStatus, 1, Cardinal(SQL_LONG) + 1);   AInBuilder.setLength(AStatus, 1, sizeof(Int32));   AInBuilder.setType(AStatus, 2, Cardinal(SQL_LONG) + 1);   AInBuilder.setLength(AStatus, 2, sizeof(Int32));   \/\/ \u0441\u0442\u0440\u043e\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432   AOutBuilder.setType(AStatus, 0, Cardinal(SQL_LONG) + 1);   AOutBuilder.setLength(AStatus, 0, sizeof(Int32)); end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<blockquote><p><strong>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043a SQL \u0442\u0438\u043f\u0443 Firebird \u0435\u0434\u0438\u043d\u0438\u0446\u0443. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u0438\u0442 \u0432 SQL \u0442\u0438\u043f\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 NULL. \u042d\u0442\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u0438 \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 XSQLDA.<\/p><\/blockquote>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">procedure TSumArgsFunction.execute(AStatus: IStatus; AContext: IExternalContext;   AInMsg, AOutMsg: Pointer); var   xInput: PSumArgsInMsg;   xOutput: PSumArgsOutMsg; begin   \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c   xInput := PSumArgsInMsg(AInMsg);   xOutput := PSumArgsOutMsg(AOutMsg);   \/\/ \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 = NULL, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u043c\u0443 nullFlag   xOutput^.resultNull := True;   \/\/ \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 NULL \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 NULL   \/\/ \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432   xOutput^.resultNull := xInput^.n1Null or xInput^.n2Null or xInput^.n3Null;   xOutput^.result := xInput^.n1 + xInput^.n2 + xInput^.n3; end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u043d\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u043a \u0442\u043e\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0443, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u0434\u0430\u043b\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 setup.<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">create or alter function FN_SUM_ARGS (     N1 varchar(15),     N2 varchar(15),     N3 varchar(15)) returns varchar(15) EXTERNAL NAME 'MyUdrSetup!sum_args' ENGINE UDR;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">select FN_SUM_ARGS('15', '21', '35') from rdb$database<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"obobschyonnye-fabriki\">\u041e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 UDR \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443, \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0443\u044e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0442\u043e UDR. \u042d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432. \u041e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Delphi 2009, \u0432 Free Pascal \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 FPC 2.2.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0412 Free Pascal \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442<br \/>  Delphi. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 FPC 2.6.0 \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441 Delphi<br \/>  \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441.<\/p><\/blockquote>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435<br \/>  \u0444\u0430\u0431\u0440\u0438\u043a\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\n<p>\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435 \u043b\u0438\u0431\u043e \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u043b\u043e\u0433\u0438\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 UDR, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b;<\/p>\n<p>  <\/li>\n<li>\n<p>\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u043b\u043e\u0433\u0438\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 UDR, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 IMessageMetadata.<\/p>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 newItem \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>IUdrFunctionFactoryImpl<\/code>, <code>IUdrProcedureFactoryImpl<\/code>, <code>IUdrTriggerFactoryImpl<\/code>. \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u0444\u0430\u0431\u0440\u0438\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">SimpleFactories<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">unit UdrFactories;  {$IFDEF FPC} {$MODE DELPHI}{$H+} {$ENDIF}  interface  uses SysUtils, Firebird;  type    \/\/ \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439   TFunctionSimpleFactory&lt;T: IExternalFunctionImpl, constructor&gt; = class     (IUdrFunctionFactoryImpl)     procedure dispose(); override;      procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AInBuilder: IMetadataBuilder;       AOutBuilder: IMetadataBuilder); override;      function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalFunction; override;   end;    \/\/ \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440   TProcedureSimpleFactory&lt;T: IExternalProcedureImpl, constructor&gt; = class     (IUdrProcedureFactoryImpl)     procedure dispose(); override;      procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AInBuilder: IMetadataBuilder;       AOutBuilder: IMetadataBuilder); override;      function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalProcedure; override;   end;    \/\/ \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432   TTriggerSimpleFactory&lt;T: IExternalTriggerImpl, constructor&gt; = class     (IUdrTriggerFactoryImpl)     procedure dispose(); override;      procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AFieldsBuilder: IMetadataBuilder); override;      function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalTrigger; override;   end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412 \u0441\u0435\u043a\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430 setup \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u0432 \u043d\u0438\u0445 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f, \u0432 \u0442\u0435\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 dispose \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0410 \u0432 \u0442\u0435\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 newItem \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>T<\/code>.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u0430\u0431\u0440\u0438\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">implementation  { TProcedureSimpleFactory&lt;T&gt; }  procedure TProcedureSimpleFactory&lt;T&gt;.dispose; begin   Destroy; end;  function TProcedureSimpleFactory&lt;T&gt;.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalProcedure; begin   Result := T.Create; end;  procedure TProcedureSimpleFactory&lt;T&gt;.setup(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata;   AInBuilder, AOutBuilder: IMetadataBuilder); begin  end;  { TFunctionFactory&lt;T&gt; }  procedure TFunctionSimpleFactory&lt;T&gt;.dispose; begin   Destroy; end;  function TFunctionSimpleFactory&lt;T&gt;.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalFunction; begin   Result := T.Create; end;  procedure TFunctionSimpleFactory&lt;T&gt;.setup(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata;   AInBuilder, AOutBuilder: IMetadataBuilder); begin  end;  { TTriggerSimpleFactory&lt;T&gt; }  procedure TTriggerSimpleFactory&lt;T&gt;.dispose; begin   Destroy; end;  function TTriggerSimpleFactory&lt;T&gt;.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalTrigger; begin   Result := T.Create; end;  procedure TTriggerSimpleFactory&lt;T&gt;.setup(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata;   AFieldsBuilder: IMetadataBuilder); begin  end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f 1 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443, \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0430\u0431\u0440\u0438\u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl; begin   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e   AUdrPlugin.registerFunction(AStatus, 'sum_args',     TFunctionSimpleFactory&lt;TSumArgsFunction&gt;.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443   AUdrPlugin.registerProcedure(AStatus, 'gen_rows',     TProcedureSimpleFactory&lt;TGenRowsProcedure&gt;.Create());   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u0442\u0440\u0438\u0433\u0433\u0435\u0440   AUdrPlugin.registerTrigger(AStatus, 'test_trigger',     TTriggerSimpleFactory&lt;TMyTrigger&gt;.Create());    theirUnloadFlag := AUnloadFlagLocal;   Result := @myUnloadFlag; end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>newItem<\/code> \u0444\u0430\u0431\u0440\u0438\u043a. \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 UDR \u0438\u043c\u0435\u044e\u0442 \u0442\u0438\u043f <code>IRoutineMetadata<\/code>, \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u043c Firebird, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b UDR. \u0418\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0442\u0438\u043f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430, \u0438\u043c\u044f UDR, \u043f\u0430\u043a\u0435\u0442\u0430, \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0438<br \/>  \u0442\u0435\u043b\u043e UDR. \u0421\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043f\u043e\u043b\u0435\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0438\u0445 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">unit UdrFactories;  {$IFDEF FPC} {$MODE DELPHI}{$H+} {$ENDIF}  interface  uses SysUtils, Firebird;  type ...    \/\/ \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438   TExternalFunction = class(IExternalFunctionImpl)     Metadata: IRoutineMetadata;   end;    \/\/ \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438   TExternalProcedure = class(IExternalProcedureImpl)     Metadata: IRoutineMetadata;   end;    \/\/ \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438   TExternalTrigger = class(IExternalTriggerImpl)     Metadata: IRoutineMetadata;   end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0430\u0448\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u044b \u043e\u0442 \u043d\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">unit UdrFactories;  {$IFDEF FPC} {$MODE DELPHI}{$H+} {$ENDIF}  interface  uses SysUtils, Firebird;  type ...    \/\/ \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438   TExternalFunction = class(IExternalFunctionImpl)     Metadata: IRoutineMetadata;   end;    \/\/ \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438   TExternalProcedure = class(IExternalProcedureImpl)     Metadata: IRoutineMetadata;   end;    \/\/ \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438   TExternalTrigger = class(IExternalTriggerImpl)     Metadata: IRoutineMetadata;   end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0430\u0448\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u044b \u043e\u0442 \u043d\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c UDR \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0430\u0431\u0440\u0438\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">unit UdrFactories;  {$IFDEF FPC} {$MODE DELPHI}{$H+} {$ENDIF}  interface  uses SysUtils, Firebird;  type ...    \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438   TFunctionFactory&lt;T: TExternalFunction, constructor&gt; = class     (IUdrFunctionFactoryImpl)     procedure dispose(); override;      procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AInBuilder: IMetadataBuilder;       AOutBuilder: IMetadataBuilder); override;      function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalFunction; override;   end;    \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438   TProcedureFactory&lt;T: TExternalProcedure, constructor&gt; = class     (IUdrProcedureFactoryImpl)     procedure dispose(); override;      procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AInBuilder: IMetadataBuilder;       AOutBuilder: IMetadataBuilder); override;      function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalProcedure; override;   end;    \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438   TTriggerFactory&lt;T: TExternalTrigger, constructor&gt; = class     (IUdrTriggerFactoryImpl)     procedure dispose(); override;      procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AFieldsBuilder: IMetadataBuilder); override;      function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalTrigger; override;   end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 newItem \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430 \u0438 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u0437\u0430<br \/>  \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0444\u0430\u0431\u0440\u0438\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">implementation ...  { TFunctionFactory&lt;T&gt; }  procedure TFunctionFactory&lt;T&gt;.dispose; begin   Destroy; end;  function TFunctionFactory&lt;T&gt;.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalFunction; begin   Result := T.Create;   (Result as T).Metadata := AMetadata; end;  procedure TFunctionFactory&lt;T&gt;.setup(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata;   AInBuilder, AOutBuilder: IMetadataBuilder); begin  end;  { TProcedureFactory&lt;T&gt; }  procedure TProcedureFactory&lt;T&gt;.dispose; begin   Destroy; end;  function TProcedureFactory&lt;T&gt;.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalProcedure; begin   Result := T.Create;   (Result as T).Metadata := AMetadata; end;  procedure TProcedureFactory&lt;T&gt;.setup(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata;   AInBuilder, AOutBuilder: IMetadataBuilder); begin  end;  { TTriggerFactory&lt;T&gt; }  procedure TTriggerFactory&lt;T&gt;.dispose; begin   Destroy; end;  function TTriggerFactory&lt;T&gt;.newItem(AStatus: IStatus;   AContext: IExternalContext; AMetadata: IRoutineMetadata): IExternalTrigger; begin   Result := T.Create;   (Result as T).Metadata := AMetadata; end;  procedure TTriggerFactory&lt;T&gt;.setup(AStatus: IStatus; AContext: IExternalContext;   AMetadata: IRoutineMetadata; AFieldsBuilder: IMetadataBuilder); begin  end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u043c\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"https:\/\/github.com\/sim1984\/udr-book\/blob\/master\/examples\/Common\/UdrFactories.pas\">https:\/\/github.com\/sim1984\/udr-book\/blob\/master\/examples\/Common\/UdrFactories.pas<\/a>.<\/p>\n<p>  <\/p>\n<h1 id=\"rabota-s-tipom-blob\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c BLOB<\/h1>\n<p>  <\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 BLOB \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 (\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 BLOB), \u0430 \u043d\u0435 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e. \u042d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, BLOB \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0432 \u0431\u0443\u0444\u0435\u0440 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0448\u0438\u0440\u0438\u043d\u044b \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432 \u0431\u0443\u0444\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 BLOB \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440. \u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430 BLOB \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437<br \/>  \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IBlob<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0438\u043f\u0430 BLOB \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e BLOB \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u0442\u0438\u043f\u043e\u043c, \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 BLOB \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c BLOB \u0441 \u043d\u043e\u0432\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 BLOB \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 BLOB \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0438 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043f\u043e\u0440\u0446\u0438\u044f\u043c\u0438 (\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438), \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0432\u0435\u043d 64 \u041a\u0431. \u0427\u0442\u0435\u043d\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>getSegment<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IBlob<\/code>. \u0417\u0430\u043f\u0438\u0441\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>putSegment<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IBlob<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"chtenie-dannyh-iz-blob\">\u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 BLOB<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0447\u0442\u0435\u043d\u0438\u044f BLOB \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442<br \/>  \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044e (\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043d\u043e\u0439<br \/>  \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LIST). \u041e\u043d\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">create procedure split (     txt blob sub_type text character set utf8,     delimiter char(1) character set utf8 = ',' ) returns (     id integer ) external name 'myudr!split' engine udr;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl; begin   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443   AUdrPlugin.registerProcedure(AStatus, 'split', TProcedureSimpleFactory&lt;TSplitProcedure&gt;.Create());    theirUnloadFlag := AUnloadFlagLocal;   Result := @myUnloadFlag; end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u0443\u044e \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u044b\u0448\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">  TInput = record     txt: ISC_QUAD;     txtNull: WordBool;     delimiter: array [0 .. 3] of AnsiChar;     delimiterNull: WordBool;   end;    TInputPtr = ^TInput;    TOutput = record     Id: Integer;     Null: WordBool;   end;    TOutputPtr = ^TOutput;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f BLOB \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 BLOB, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <code>ISC_QUAD<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b Split \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">  TSplitProcedure = class(IExternalProcedureImpl)   private     procedure SaveBlobToStream(AStatus: IStatus; AContext: IExternalContext;       ABlobId: ISC_QUADPtr; AStream: TStream);     function readBlob(AStatus: IStatus; AContext: IExternalContext;       ABlobId: ISC_QUADPtr): string;   public     \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b     procedure dispose(); override;      procedure getCharSet(AStatus: IStatus; AContext: IExternalContext;       AName: PAnsiChar; ANameSize: Cardinal); override;      function open(AStatus: IStatus; AContext: IExternalContext; AInMsg: Pointer;       AOutMsg: Pointer): IExternalResultSet; override;   end;    TSplitResultSet = class(IExternalResultSetImpl) {$IFDEF FPC}     OutputArray: TStringArray; {$ELSE}     OutputArray: TArray&lt;string&gt;; {$ENDIF}     Counter: Integer;     Output: TOutputPtr;      procedure dispose(); override;     function fetch(AStatus: IStatus): Boolean; override;   end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b <code>SaveBlobToStream<\/code> \u0438 <code>readBlob<\/code> \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f BLOB. \u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0438\u0442\u0430\u0435\u0442 BLOB \u0432 \u043f\u043e\u0442\u043e\u043a, \u0432\u0442\u043e\u0440\u0430\u044f \u2014 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0447\u0442\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 Delphi. \u0412 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u043e\u043a OutputArray \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 Counter.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 open \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f BLOB \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0443. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <code>Split<\/code> \u0438\u0437 \u0445\u0435\u043b\u043f\u0435\u0440\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u043e\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">TSplitProcedure.open<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">function TSplitProcedure.open(AStatus: IStatus; AContext: IExternalContext;   AInMsg, AOutMsg: Pointer): IExternalResultSet; var   xInput: TInputPtr;   xText: string;   xDelimiter: string; begin   xInput := AInMsg;   if xInput.txtNull or xInput.delimiterNull then   begin     Result := nil;     Exit;   end;    xText := readBlob(AStatus, AContext, @xInput.txt);   xDelimiter := TFBCharSet.CS_UTF8.GetString(TBytes(@xInput.delimiter), 0, 4);   \/\/ \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438   \/\/ \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b \u043d\u0443\u043b\u0451\u043c   \/\/ \u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u043b-\u0432\u043e \u0431\u0430\u0439\u0442\/4   SetLength(xDelimiter, 1);    Result := TSplitResultSet.Create;   with TSplitResultSet(Result) do   begin     Output := AOutMsg;     OutputArray := xText.Split([xDelimiter], TStringSplitOptions.ExcludeEmpty);     Counter := 0;   end; end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0422\u0438\u043f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <code>TFBCharSet<\/code> \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 Firebird.pas. \u041e\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043c\u043d\u043e\u044e<br \/>  \u0434\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 Firebird. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c<br \/>  \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8.<br \/>  \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c <a href=\"https:\/\/github.com\/sim1984\/udr-book\/blob\/master\/examples\/Common\/FbCharsets.pas\">FbCharsets.pas<\/a><\/p><\/blockquote>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 BLOB \u0432 \u043f\u043e\u0442\u043e\u043a. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 BLOB \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u0432 \u043c\u0435\u0442\u043e\u0434 openBlob \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IAttachment<\/code>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0447\u0438\u0442\u0430\u0435\u043c BLOB \u0438\u0437 \u0441\u0432\u043e\u0435\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430<br \/>  (\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IExternalContext<\/code>).<\/p>\n<p>  <\/p>\n<p>BLOB \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u0446\u0438\u044f\u043c\u0438 (\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438), \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0432\u0435\u043d 64 \u041a\u0431. \u0427\u0442\u0435\u043d\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>getSegment<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IBlob<\/code>.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">TSplitProcedure.SaveBlobToStream<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">procedure TSplitProcedure.SaveBlobToStream(AStatus: IStatus;   AContext: IExternalContext; ABlobId: ISC_QUADPtr; AStream: TStream); var   att: IAttachment;   trx: ITransaction;   blob: IBlob;   buffer: array [0 .. 32767] of AnsiChar;   l: Integer; begin   try     att := AContext.getAttachment(AStatus);     trx := AContext.getTransaction(AStatus);     blob := att.openBlob(AStatus, trx, ABlobId, 0, nil);     while True do     begin       case blob.getSegment(AStatus, SizeOf(buffer), @buffer, @l) of         IStatus.RESULT_OK:           AStream.WriteBuffer(buffer, l);         IStatus.RESULT_SEGMENT:           AStream.WriteBuffer(buffer, l);       else         break;       end;     end;     AStream.Position := 0;     blob.close(AStatus);   finally     if Assigned(att) then       att.release;     if Assigned(trx) then       trx.release;     if Assigned(blob) then       blob.release;   end; end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b <code>IAttachment<\/code>, <code>ITransaction<\/code> \u0438 <code>IBlob<\/code><br \/>  \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IReferenceCounted<\/code>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441<br \/>  \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u043e\u043c \u0441\u0441\u044b\u043b\u043e\u043a. \u041c\u0435\u0442\u043e\u0434\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u044d\u0442\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<br \/>  \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u0432 1. \u041f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u043a\u0438\u043c\u0438<br \/>  \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 release.<\/p><\/blockquote>\n<p>\u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>SaveBlobToStream<\/code> \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0447\u0442\u0435\u043d\u0438\u044f BLOB \u0432<br \/>  \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function TSplitProcedure.readBlob(AStatus: IStatus; AContext: IExternalContext;   ABlobId: ISC_QUADPtr): string; var {$IFDEF FPC}   xStream: TBytesStream; {$ELSE}   xStream: TStringStream; {$ENDIF} begin {$IFDEF FPC}   xStream := TBytesStream.Create(nil); {$ELSE}   xStream := TStringStream.Create('', 65001); {$ENDIF}   try     SaveBlobToStream(AStatus, AContext, ABlobId, xStream); {$IFDEF FPC}     Result := TEncoding.UTF8.GetString(xStream.Bytes, 0, xStream.Size); {$ELSE}     Result := xStream.DataString; {$ENDIF}   finally     xStream.Free;   end; end;<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e Free Pascal \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c<br \/>  \u0441 Delphi \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>TStringStream<\/code>. \u0412 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f FPC \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c<br \/>  \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f<br \/>  \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u043e\u0441\u043e\u0431\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p><\/blockquote>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>fetch<\/code> \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c Counter \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u0451\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0451\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u043a \u0446\u0435\u043b\u043e\u043c\u0443. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0431\u0443\u0436\u0434\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c <code>isc_convert_error<\/code>.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0432\u044b\u0431\u0440\u043e\u0441 isc_convert_error<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">procedure TSplitResultSet.dispose; begin   SetLength(OutputArray, 0);   Destroy; end;  function TSplitResultSet.fetch(AStatus: IStatus): Boolean; var   statusVector: array [0 .. 4] of NativeIntPtr; begin   if Counter &lt;= High(OutputArray) then   begin     Output.Null := False;     \/\/ \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u044b \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c isc_random     \/\/ \u0437\u0434\u0435\u0441\u044c \u0436\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0434\u043b\u044f Firebird     \/\/ \u043e\u0448\u0438\u0431\u043a\u0443 isc_convert_error     try       Output.Id := OutputArray[Counter].ToInteger();     except       on e: EConvertError do       begin          statusVector[0] := NativeIntPtr(isc_arg_gds);         statusVector[1] := NativeIntPtr(isc_convert_error);         statusVector[2] := NativeIntPtr(isc_arg_string);         statusVector[3] := NativeIntPtr(PAnsiChar('Cannot convert string to integer'));         statusVector[4] := NativeIntPtr(isc_arg_end);          AStatus.setErrors(@statusVector);       end;     end;     inc(Counter);     Result := True;   end   else     Result := False; end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043b\u044e\u0431\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043a\u0440\u043e\u043c\u0435 <code>isc_random<\/code> \u043d\u0435 \u043e\u0447\u0435\u043d\u044c<br \/>  \u0443\u0434\u043e\u0431\u043d\u0430, \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443.<\/p><\/blockquote>\n<p>\u0420\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">SELECT ids.ID FROM SPLIT((SELECT LIST(ID) FROM MYTABLE), ',') ids<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0413\u043b\u0430\u0432\u043d\u044b\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e BLOB \u0431\u0443\u0434\u0435\u0442<br \/>  \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0441\u0440\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c<br \/>  \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u0437 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u0434<br \/>  \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u043b\u043e\u0441\u044c<br \/>  \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u0440\u0446\u0438\u044f\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043f\u043e\u0440\u0446\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e<br \/>  \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>fetch<\/code> \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/p><\/blockquote>\n<p>  <\/p>\n<h2 id=\"zapis-dannyh-v-blob\">\u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 BLOB<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 BLOB \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0447\u0438\u0442\u0430\u044e\u0449\u0443\u044e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435<br \/>  BLOB \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 UDF \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438<br \/>  \u0437\u0430\u043f\u0438\u0441\u0438 BLOB \u0438\u0437\/\u0432 \u0444\u0430\u0439\u043b. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f UDF \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<br \/>  <a href=\"http:\/\/www.ibase.ru\/files\/download\/blobsaveload.zip\">blobsaveload.zip<\/a><\/p><\/blockquote>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 BLOB \u0438\u0437\/\u0432 \u0444\u0430\u0439\u043b \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 \u043f\u0430\u043a\u0435\u0442\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">CREATE PACKAGE BlobFileUtils AS BEGIN   PROCEDURE SaveBlobToFile(ABlob BLOB, AFileName VARCHAR(255) CHARACTER SET UTF8);    FUNCTION LoadBlobFromFile(AFileName VARCHAR(255) CHARACTER SET UTF8) RETURNS BLOB; END^  CREATE PACKAGE BODY BlobFileUtils AS BEGIN   PROCEDURE SaveBlobToFile(ABlob BLOB, AFileName VARCHAR(255) CHARACTER SET UTF8)   EXTERNAL NAME 'BlobFileUtils!SaveBlobToFile'   ENGINE UDR;    FUNCTION LoadBlobFromFile(AFileName VARCHAR(255) CHARACTER SET UTF8) RETURNS BLOB   EXTERNAL NAME 'BlobFileUtils!LoadBlobFromFile'   ENGINE UDR; END^<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl; begin   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c   AUdrPlugin.registerProcedure(AStatus, 'SaveBlobToFile', TSaveBlobToFileProcFactory.Create());   AUdrPlugin.registerFunction(AStatus, 'LoadBlobFromFile', TLoadBlobFromFileFuncFactory.Create());    theirUnloadFlag := AUnloadFlagLocal;   Result := @myUnloadFlag; end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 BLOB \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 UDR \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<br \/>  <a href=\"https:\/\/github.com\/sim1984\/udr-book\/tree\/master\/examples\/06.%20BlobSaveLoad\">06.BlobSaveLoad<\/a>. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044f \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LoadBlobFromFile \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">interface  uses   Firebird, Classes, SysUtils;  type    \/\/ \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   TInput = record     filename: record       len: Smallint;       str: array [0 .. 1019] of AnsiChar;     end;     filenameNull: WordBool;   end;   TInputPtr = ^TInput;    \/\/ \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   TOutput = record     blobData: ISC_QUAD;     blobDataNull: WordBool;   end;   TOutputPtr = ^TOutput;    \/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LoadBlobFromFile   TLoadBlobFromFileFunc = class(IExternalFunctionImpl)   public     procedure dispose(); override;      procedure getCharSet(AStatus: IStatus; AContext: IExternalContext;       AName: PAnsiChar; ANameSize: Cardinal); override;      procedure execute(AStatus: IStatus; AContext: IExternalContext;       AInMsg: Pointer; AOutMsg: Pointer); override;   end;    \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 LoadBlobFromFile   TLoadBlobFromFileFuncFactory = class(IUdrFunctionFactoryImpl)     procedure dispose(); override;      procedure setup(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata; AInBuilder: IMetadataBuilder;       AOutBuilder: IMetadataBuilder); override;      function newItem(AStatus: IStatus; AContext: IExternalContext;       AMetadata: IRoutineMetadata): IExternalFunction; override;   end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <code>execute<\/code> \u043a\u043b\u0430\u0441\u0441\u0430 <code>TLoadBlobFromFile<\/code>, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 execute<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">procedure TLoadBlobFromFileFunc.execute(AStatus: IStatus;   AContext: IExternalContext; AInMsg: Pointer; AOutMsg: Pointer); const   MaxBufSize = 16384; var   xInput: TInputPtr;   xOutput: TOutputPtr;   xFileName: string;   xStream: TFileStream;   att: IAttachment;   trx: ITransaction;   blob: IBlob;   buffer: array [0 .. 32767] of Byte;   xStreamSize: Integer;   xBufferSize: Integer;   xReadLength: Integer; begin   xInput := AInMsg;   xOutput := AOutMsg;   if xInput.filenameNull then   begin     xOutput.blobDataNull := True;     Exit;   end;   xOutput.blobDataNull := False;   \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430   xFileName := TEncoding.UTF8.GetString(TBytes(@xInput.filename.str), 0,     xInput.filename.len * 4);   SetLength(xFileName, xInput.filename.len);   \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0432 \u043f\u043e\u0442\u043e\u043a   xStream := TFileStream.Create(xFileName, fmOpenRead or fmShareDenyNone);   att := AContext.getAttachment(AStatus);   trx := AContext.getTransaction(AStatus);   blob := nil;   try     xStreamSize := xStream.Size;     \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 (\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430)     if xStreamSize &gt; MaxBufSize then       xBufferSize := MaxBufSize     else       xBufferSize := xStreamSize;     \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 blob     blob := att.createBlob(AStatus, trx, @xOutput.blobData, 0, nil);     \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0432 BLOB \u043f\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u043e     while xStreamSize &lt;&gt; 0 do     begin       if xStreamSize &gt; xBufferSize then         xReadLength := xBufferSize       else         xReadLength := xStreamSize;       xStream.ReadBuffer(buffer, xReadLength);        blob.putSegment(AStatus, xReadLength, @buffer[0]);        Dec(xStreamSize, xReadLength);     end;     \/\/ \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c BLOB     blob.close(AStatus);   finally     if Assigned(blob) then       blob.release;     att.release;     trx.release;     xStream.Free;   end; end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 BLOB \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0435\u0433\u043e \u0432 blobId \u0432\u044b\u0445\u043e\u0434\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>createBlob<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IAttachment<\/code>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043f\u0443\u0441\u0442\u044c \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 BLOB \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 (\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IExternalContext<\/code>).<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 BLOB, \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043f\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>putSegment<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IBlob<\/code> \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 \u0444\u0430\u0439\u043b\u0430 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0430\u0442\u0441\u044f. \u041f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u043b\u043e\u0431 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>close<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"helper-dlya-raboty-s-tipom-blob\">\u0425\u0435\u043b\u043f\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u043e\u043c BLOB<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0432\u044b\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e BLOB \u0432<br \/>  \u043f\u043e\u0442\u043e\u043a, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e BLOB \u0432 \u043f\u043e\u0442\u043e\u043a. \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u0430\u044f<br \/>  \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0438\u043f\u043e\u043c BLOB, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c<br \/>  \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 Delphi \u0438 Free Pascal \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435<br \/>  \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u0442\u0438\u043f\u044b \u0431\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0445\u044d\u043b\u043f\u0435\u0440\u043e\u0432.<br \/>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IBlob \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e<br \/>  \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u0437\/\u0432 Blob.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c FbBlob, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0451\u043d \u043d\u0430\u0448 \u0445\u044d\u043b\u043f\u0435\u0440.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">BlobHelper<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">unit FbBlob;  interface  uses Classes, SysUtils, Firebird;  const   MAX_SEGMENT_SIZE = $7FFF;  type   TFbBlobHelper = class helper for IBlob     { \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432 BLOB \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e\u0442\u043e\u043a\u0430        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AStream \u041f\u043e\u0442\u043e\u043a)     }     procedure LoadFromStream(AStatus: IStatus; AStream: TStream);     { \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 BLOB        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AStream \u041f\u043e\u0442\u043e\u043a)     }     procedure SaveToStream(AStatus: IStatus; AStream: TStream);   end;  implementation  uses Math;  procedure TFbBlobHelper.LoadFromStream(AStatus: IStatus; AStream: TStream); var   xStreamSize: Integer;   xReadLength: Integer;   xBuffer: array [0 .. MAX_SEGMENT_SIZE] of Byte; begin   xStreamSize := AStream.Size;   AStream.Position := 0;   while xStreamSize &lt;&gt; 0 do   begin     xReadLength := Min(xStreamSize, MAX_SEGMENT_SIZE);     AStream.ReadBuffer(xBuffer, xReadLength);     Self.putSegment(AStatus, xReadLength, @xBuffer[0]);     Dec(xStreamSize, xReadLength);   end; end;  procedure TFbBlobHelper.SaveToStream(AStatus: IStatus; AStream: TStream); var   xInfo: TFbBlobInfo;   Buffer: array [0 .. MAX_SEGMENT_SIZE] of Byte;   xBytesRead: Cardinal;   xBufferSize: Cardinal; begin   AStream.Position := 0;   xBufferSize := Min(SizeOf(Buffer), MAX_SEGMENT_SIZE);   while True do   begin     case Self.getSegment(AStatus, xBufferSize, @Buffer[0], @xBytesRead) of       IStatus.RESULT_OK:         AStream.WriteBuffer(Buffer, xBytesRead);       IStatus.RESULT_SEGMENT:         AStream.WriteBuffer(Buffer, xBytesRead);     else       break;     end;   end; end;  end.<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0442\u0438\u043f\u043e\u043c BLOB, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f BLOB \u0432 \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u0430 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">TLoadBlobFromFileFunc.execute<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">procedure TLoadBlobFromFileFunc.execute(AStatus: IStatus;   AContext: IExternalContext; AInMsg: Pointer; AOutMsg: Pointer); var   xInput: TInputPtr;   xOutput: TOutputPtr;   xFileName: string;   xStream: TFileStream;   att: IAttachment;   trx: ITransaction;   blob: IBlob; begin   xInput := AInMsg;   xOutput := AOutMsg;   if xInput.filenameNull then   begin     xOutput.blobDataNull := True;     Exit;   end;   xOutput.blobDataNull := False;   \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430   xFileName := TEncoding.UTF8.GetString(TBytes(@xInput.filename.str), 0,     xInput.filename.len * 4);   SetLength(xFileName, xInput.filename.len);   \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0432 \u043f\u043e\u0442\u043e\u043a   xStream := TFileStream.Create(xFileName, fmOpenRead or fmShareDenyNone);   att := AContext.getAttachment(AStatus);   trx := AContext.getTransaction(AStatus);   blob := nil;   try     \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 blob     blob := att.createBlob(AStatus, trx, @xOutput.blobData, 0, nil);     \/\/ \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 BLOB     blob.LoadFromStream(AStatus, xStream);     \/\/ \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c BLOB     blob.close(AStatus);   finally     if Assigned(blob) then       blob.release;     att.release;     trx.release;     xStream.Free;   end; end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h1 id=\"kontekst-soedineniya-i-tranzakcii\">\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0430 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\/\u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0435\u0441\u043b\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0442\u0438\u043f\u043e\u043c BLOB.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c <code>IExternalContext<\/code> \u0432 \u043c\u0435\u0442\u043e\u0434 execute \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u043b\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434 open \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IExternalContext<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>getAttachment<\/code>, \u0438 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>getTransaction<\/code>. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0432\u0430\u0448\u0438\u043c UDR, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0432 \u043d\u043e\u0432\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>startTransaction<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IExternalContext<\/code>. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u043e\u0439 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0442.\u0435. \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0441 \u0434\u0432\u0443\u0445\u0444\u0430\u0437\u043d\u044b\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c (2PC).<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f SELECT \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON. \u041e\u043d\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">create function GetJson (     sql_text blob sub_type text character set utf8,     sql_dialect smallint not null default 3 ) returns returns blob sub_type text character set utf8 external name 'JsonUtils!getJson' engine udr;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 SQL \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439, \u0438 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c <code>IMessageMetadata<\/code>. \u041c\u044b \u0443\u0436\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441 \u043d\u0438\u043c \u0440\u0430\u043d\u0435\u0435, \u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b<br \/>  \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b Firebird.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u0412 JSON \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0440\u043e\u043c\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445.<br \/>  \u0414\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 CHAR, VARCHAR \u0441 OCTETS NONE \u0438 BLOB SUB_TYPE BINARY<br \/>  \u0431\u0443\u0434\u0435\u043c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f base64,<br \/>  \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432 JSON.<\/p><\/blockquote>\n<p>\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"delphi\">function firebird_udr_plugin(AStatus: IStatus; AUnloadFlagLocal: BooleanPtr;   AUdrPlugin: IUdrPlugin): BooleanPtr; cdecl; begin   \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e   AUdrPlugin.registerFunction(AStatus, 'getJson', TFunctionSimpleFactory&lt;TJsonFunction&gt;.Create());    theirUnloadFlag := AUnloadFlagLocal;   Result := @myUnloadFlag; end;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 GetJson<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">unit JsonFunc;  {$IFDEF FPC} {$MODE objfpc}{$H+} {$DEFINE DEBUGFPC} {$ENDIF}  interface  uses   Firebird,   UdrFactories,   FbTypes,   FbCharsets,   SysUtils,   System.NetEncoding,   System.Json;  \/\/ ********************************************************* \/\/ create function GetJson ( \/\/   sql_text blob sub_type text, \/\/   sql_dialect smallint not null default 3 \/\/ ) returns blob sub_type text character set utf8 \/\/ external name 'JsonUtils!getJson' \/\/ engine udr; \/\/ *********************************************************  type    TInput = record     SqlText: ISC_QUAD;     SqlNull: WordBool;     SqlDialect: Smallint;     SqlDialectNull: WordBool;   end;    InputPtr = ^TInput;    TOutput = record     Json: ISC_QUAD;     NullFlag: WordBool;   end;    OutputPtr = ^TOutput;    \/\/ \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f TSumArgsFunction.   TJsonFunction = class(IExternalFunctionImpl)   public     procedure dispose(); override;      procedure getCharSet(AStatus: IStatus; AContext: IExternalContext;       AName: PAnsiChar; ANameSize: Cardinal); override;      { \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0446\u0435\u043b\u043e\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u043c        @param(AValue \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435)       @param(Scale \u041c\u0430\u0441\u0448\u0442\u0430\u0431)       @returns(\u0421\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e)     }     function MakeScaleInteger(AValue: Int64; Scale: Smallint): string;      { \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 Json        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AJson \u041c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 Json)       @param(ABuffer \u0411\u0443\u0444\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u0438)       @param(AMeta \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430)       @param(AFormatSetting \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438)     }     procedure writeJson(AStatus: IStatus; AContext: IExternalContext;       AJson: TJsonArray; ABuffer: PByte; AMeta: IMessageMetadata;       AFormatSettings: TFormatSettings);      { \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438        @param(AStatus \u0421\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u043a\u0442\u043e\u0440)       @param(AContext \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)       @param(AInMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)       @param(AOutMsg \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435)     }     procedure execute(AStatus: IStatus; AContext: IExternalContext;       AInMsg: Pointer; AOutMsg: Pointer); override;   end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>MakeScaleInteger<\/code> \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u043c\u0435\u0442\u043e\u0434 <code>writeJson<\/code> \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0438\u0437 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432 Json \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u042d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043c\u044b \u043e\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u0437\u0436\u0435, \u0430 \u043f\u043e\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 <code>execute<\/code> \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">TJsonFunction.execute<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">procedure TJsonFunction.execute(AStatus: IStatus; AContext: IExternalContext;   AInMsg, AOutMsg: Pointer); var   xFormatSettings: TFormatSettings;   xInput: InputPtr;   xOutput: OutputPtr;   att: IAttachment;   tra: ITransaction;   stmt: IStatement;   inBlob, outBlob: IBlob;   inStream: TBytesStream;   outStream: TStringStream;   cursorMetaData: IMessageMetadata;   rs: IResultSet;   msgLen: Cardinal;   msg: Pointer;   jsonArray: TJsonArray; begin   xInput := AInMsg;   xOutput := AOutMsg;   \/\/ \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 NULL, \u0442\u043e \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 NULL   if xInput.SqlNull or xInput.SqlDialectNull then   begin     xOutput.NullFlag := True;     Exit;   end;   xOutput.NullFlag := False;   \/\/ \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438   xFormatSettings := TFormatSettings.Create;   xFormatSettings.DateSeparator := '-';   xFormatSettings.TimeSeparator := ':';   \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f blob   inStream := TBytesStream.Create(nil);   outStream := TStringStream.Create('', 65001);   jsonArray := TJsonArray.Create;   \/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438   att := AContext.getAttachment(AStatus);   tra := AContext.getTransaction(AStatus);   stmt := nil;   inBlob := nil;   outBlob := nil;   try     \/\/ \u0447\u0438\u0442\u0430\u0435\u043c BLOB \u0432 \u043f\u043e\u0442\u043e\u043a     inBlob := att.openBlob(AStatus, tra, @xInput.SqlText, 0, nil);     inBlob.SaveToStream(AStatus, inStream);     inBlob.close(AStatus);     \/\/ \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440     stmt := att.prepare(AStatus, tra, inStream.Size, @inStream.Bytes[0],       xInput.SqlDialect, IStatement.PREPARE_PREFETCH_METADATA);     \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430     cursorMetaData := stmt.getOutputMetadata(AStatus);     \/\/ \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0443\u0440\u0441\u043e\u0440     rs := stmt.openCursor(AStatus, tra, nil, nil, nil, 0);     \/\/ \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u0431\u0443\u0444\u0435\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430     msgLen := cursorMetaData.getMessageLength(AStatus);     msg := AllocMem(msgLen);     try       \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043a\u0443\u0440\u0441\u043e\u0440\u0430       while rs.fetchNext(AStatus, msg) = IStatus.RESULT_OK do       begin         \/\/ \u0438 \u043f\u0438\u0448\u0435\u043c \u0435\u0451 \u0432 JSON         writeJson(AStatus, AContext, jsonArray, msg, cursorMetaData, xFormatSettings);       end;     finally       \/\/ \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u0431\u0443\u0444\u0435\u0440       FreeMem(msg);     end;     \/\/ \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0443\u0440\u0441\u043e\u0440     rs.close(AStatus);     \/\/ \u043f\u0438\u0448\u0435\u043c JSON \u0432 \u043f\u043e\u0442\u043e\u043a     outStream.WriteString(jsonArray.ToJSON);      \/\/ \u043f\u0438\u0448\u0435\u043c json \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 blob     outBlob := att.createBlob(AStatus, tra, @xOutput.Json, 0, nil);     outBlob.LoadFromStream(AStatus, outStream);     outBlob.close(AStatus);   finally     if Assigned(inBlob) then       inBlob.release;     if Assigned(stmt) then       stmt.release;     if Assigned(outBlob) then       outBlob.release;     tra.release;     att.release;     jsonArray.Free;     inStream.Free;     outStream.Free;   end; end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>getAttachment<\/code> \u0438 <code>getTransaction<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IExternalContext<\/code>. \u0417\u0430\u0442\u0435\u043c \u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 BLOB \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 prepare \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IAttachment<\/code>. \u041f\u044f\u0442\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f SQL \u0434\u0438\u0430\u043b\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0428\u0435\u0441\u0442\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0444\u043b\u0430\u0433 <code>IStatement.PREPARE_PREFETCH_METADATA<\/code>, \u0447\u0442\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043f\u0440\u0435\u043f\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0421\u0430\u043c\u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>getOutputMetadata<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IStatement<\/code>.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u0435\u0442\u043e\u0434 getOutputMetadata \u0432\u0435\u0440\u043d\u0451\u0442 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<br \/>  \u0424\u043b\u0430\u0433 <code>IStatement.PREPARE_PREFETCH_METADATA<\/code> \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043c\u0435\u0441\u0442\u0435<br \/>  \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0437\u0430 \u043e\u0434\u0438\u043d \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u0430\u043a\u0435\u0442. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441<br \/>  \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0438 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e.<\/p><\/blockquote>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0443\u0440\u0441\u043e\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 openCursor \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 2). \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>getMessageLength<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IMessageMetadata<\/code>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0431\u0443\u0444\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0447\u0438\u0442\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0438\u0441\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>fetchNext<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IResultSet<\/code>. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0431\u0443\u0444\u0435\u0440 <code>msg<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u043b\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>IStatus.RESULT_OK<\/code> \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u043d\u0435 \u043a\u043e\u043d\u0447\u0430\u0442\u0441\u044f. \u041a\u0430\u0436\u0434\u0430\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434 <code>writeJson<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 <code>TJsonObject<\/code> \u0441 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>TJsonArray<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>close<\/code>, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 Json \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u043f\u0438\u0448\u0435\u043c \u0435\u0451 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 Blob.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043c\u0435\u0442\u043e\u0434 <code>writeJson<\/code>. \u041e\u0431\u044a\u0435\u043a\u0442 <code>IUtil<\/code> \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IMessageMetadata<\/code>. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f <code>TJsonObject<\/code> \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043c\u0451\u043d \u043a\u043b\u044e\u0447\u0435\u0439 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0438\u0430\u0441\u044b \u043f\u043e\u043b\u0435\u0439 \u0438\u0437 \u043a\u0443\u0440\u0441\u043e\u0440\u0430. \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d NullFlag, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 null \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0430 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u043b\u044e, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0442\u0438\u043f \u043f\u043e\u043b\u044f \u0438 \u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 Json.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f writeJson<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">function TJsonFunction.MakeScaleInteger(AValue: Int64; Scale: Smallint): string; var   L: Integer; begin   Result := AValue.ToString;   L := Result.Length;   if (-Scale &gt;= L) then     Result := '0.' + Result.PadLeft(-Scale, '0')   else     Result := Result.Insert(Scale + L, '.'); end;  procedure TJsonFunction.writeJson(AStatus: IStatus; AContext: IExternalContext;   AJson: TJsonArray; ABuffer: PByte; AMeta: IMessageMetadata;   AFormatSettings: TFormatSettings); var   jsonObject: TJsonObject;   i: Integer;   FieldName: string;   NullFlag: WordBool;   pData: PByte;   util: IUtil;   metaLength: Integer;   \/\/ \u0442\u0438\u043f\u044b   CharBuffer: array [0 .. 35766] of Byte;   charLength: Smallint;   charset: TFBCharSet;   StringValue: string;   SmallintValue: Smallint;   IntegerValue: Integer;   BigintValue: Int64;   Scale: Smallint;   SingleValue: Single;   DoubleValue: Double;   BooleanValue: Boolean;   DateValue: ISC_DATE;   TimeValue: ISC_TIME;   TimestampValue: ISC_TIMESTAMP;   DateTimeValue: TDateTime;   year, month, day: Cardinal;   hours, minutes, seconds, fractions: Cardinal;   blobId: ISC_QUADPtr;   BlobSubtype: Smallint;   blob: IBlob;   textStream: TStringStream;   binaryStream: TBytesStream;   att: IAttachment;   tra: ITransaction; begin   \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c IUtil   util := AContext.getMaster().getUtilInterface();   \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 TJsonObject \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u043c   \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438   jsonObject := TJsonObject.Create;   for i := 0 to AMeta.getCount(AStatus) - 1 do   begin     \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u043b\u0438\u0430\u0441 \u043f\u043e\u043b\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435     FieldName := AMeta.getAlias(AStatus, i);     NullFlag := PWordBool(ABuffer + AMeta.getNullOffset(AStatus, i))^;     if NullFlag then     begin       \/\/ \u0435\u0441\u043b\u0438 NULL \u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0432 JSON \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u043b\u044e       jsonObject.AddPair(FieldName, TJsonNull.Create);       continue;     end;     \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f     pData := ABuffer + AMeta.getOffset(AStatus, i);     case TFBType(AMeta.getType(AStatus, i)) of       \/\/ VARCHAR       SQL_VARYING:         begin           \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f VARCHAR           metaLength := AMeta.getLength(AStatus, i);           charset := TFBCharSet(AMeta.getCharSet(AStatus, i));           \/\/ \u0414\u043b\u044f VARCHAR \u043f\u0435\u0440\u0432\u044b\u0435 2 \u0431\u0430\u0439\u0442\u0430 - \u0434\u043b\u0438\u043d\u0430           charLength := PSmallint(pData)^;           \/\/ \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0432 base64           if charset = CS_BINARY then             StringValue := TNetEncoding.Base64.EncodeBytesToString((pData + 2),               charLength)           else           begin             \/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 3 \u0431\u0430\u0439\u0442\u0430             Move((pData + 2)^, CharBuffer, metaLength - 2);             StringValue := charset.GetString(TBytes(@CharBuffer), 0,               charLength * charset.GetCharWidth)             SetLength(StringValue, charLength);           end;           jsonObject.AddPair(FieldName, StringValue);         end;       \/\/ CHAR       SQL_TEXT:         begin           \/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f CHAR           metaLength := AMeta.getLength(AStatus, i);           charset := TFBCharSet(AMeta.getCharSet(AStatus, i));           \/\/ \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0432 base64           if charset = CS_BINARY then             StringValue := TNetEncoding.Base64.EncodeBytesToString((pData + 2),               metaLength)           else           begin             \/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440             Move(pData^, CharBuffer, metaLength);             StringValue := charset.GetString(TBytes(@CharBuffer), 0,               metaLength);             charLength := metaLength div charset.GetCharWidth;             SetLength(StringValue, charLength);           end;           jsonObject.AddPair(FieldName, StringValue);         end;       \/\/ FLOAT       SQL_FLOAT:         begin           SingleValue := PSingle(pData)^;           jsonObject.AddPair(FieldName, TJSONNumber.Create(SingleValue));         end;       \/\/ DOUBLE PRECISION       \/\/ DECIMAL(p, s), \u0433\u0434\u0435 p = 10..15 \u0432 1 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0435       SQL_DOUBLE, SQL_D_FLOAT:         begin           DoubleValue := PDouble(pData)^;           jsonObject.AddPair(FieldName, TJSONNumber.Create(DoubleValue));         end;       \/\/ INTEGER       \/\/ NUMERIC(p, s), \u0433\u0434\u0435 p = 1..4       SQL_SHORT:         begin           Scale := AMeta.getScale(AStatus, i);           SmallintValue := PSmallint(pData)^;           if (Scale = 0) then           begin             jsonObject.AddPair(FieldName, TJSONNumber.Create(SmallintValue));           end           else           begin             StringValue := MakeScaleInteger(SmallintValue, Scale);             jsonObject.AddPair(FieldName, TJSONNumber.Create(StringValue));           end;         end;       \/\/ INTEGER       \/\/ NUMERIC(p, s), \u0433\u0434\u0435 p = 5..9       \/\/ DECIMAL(p, s), \u0433\u0434\u0435 p = 1..9       SQL_LONG:         begin           Scale := AMeta.getScale(AStatus, i);           IntegerValue := PInteger(pData)^;           if (Scale = 0) then           begin             jsonObject.AddPair(FieldName, TJSONNumber.Create(IntegerValue));           end           else           begin             StringValue := MakeScaleInteger(IntegerValue, Scale);             jsonObject.AddPair(FieldName, TJSONNumber.Create(StringValue));           end;         end;       \/\/ BIGINT       \/\/ NUMERIC(p, s), \u0433\u0434\u0435 p = 10..18 \u0432 3 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0435       \/\/ DECIMAL(p, s), \u0433\u0434\u0435 p = 10..18 \u0432 3 \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u0435       SQL_INT64:         begin           Scale := AMeta.getScale(AStatus, i);           BigintValue := Pint64(pData)^;           if (Scale = 0) then           begin             jsonObject.AddPair(FieldName, TJSONNumber.Create(BigintValue));           end           else           begin             StringValue := MakeScaleInteger(BigintValue, Scale);             jsonObject.AddPair(FieldName, TJSONNumber.Create(StringValue));           end;         end;       \/\/ TIMESTAMP       SQL_TIMESTAMP:         begin           TimestampValue := PISC_TIMESTAMP(pData)^;           \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0434\u0430\u0442\u044b-\u0432\u0440\u0435\u043c\u0435\u043d\u0438           util.decodeDate(TimestampValue.date, @year, @month, @day);           util.decodeTime(TimestampValue.time, @hours, @minutes, @seconds,             @fractions);           \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u0442\u0443-\u0432\u0440\u0435\u043c\u044f \u0432 \u0440\u043e\u0434\u043d\u043e\u043c \u0442\u0438\u043f\u0435 Delphi           DateTimeValue := EncodeDate(year, month, day) +             EncodeTime(hours, minutes, seconds, fractions div 10);           \/\/ \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u0442\u0443-\u0432\u0440\u0435\u043c\u044f \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0443           StringValue := FormatDateTime('yyyy\/mm\/dd hh:nn:ss', DateTimeValue,             AFormatSettings);           jsonObject.AddPair(FieldName, StringValue);         end;       \/\/ DATE       SQL_DATE:         begin           DateValue := PISC_DATE(pData)^;           \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0434\u0430\u0442\u044b           util.decodeDate(DateValue, @year, @month, @day);           \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u0442\u0443 \u0432 \u0440\u043e\u0434\u043d\u043e\u043c \u0442\u0438\u043f\u0435 Delphi           DateTimeValue := EncodeDate(year, month, day);           \/\/ \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u0442\u0443 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0443           StringValue := FormatDateTime('yyyy\/mm\/dd', DateTimeValue,             AFormatSettings);           jsonObject.AddPair(FieldName, StringValue);         end;       \/\/ TIME       SQL_TIME:         begin           TimeValue := PISC_TIME(pData)^;           \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438           util.decodeTime(TimeValue, @hours, @minutes, @seconds, @fractions);           \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u0432 \u0440\u043e\u0434\u043d\u043e\u043c \u0442\u0438\u043f\u0435 Delphi           DateTimeValue := EncodeTime(hours, minutes, seconds,             fractions div 10);           \/\/ \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0443           StringValue := FormatDateTime('hh:nn:ss', DateTimeValue,             AFormatSettings);           jsonObject.AddPair(FieldName, StringValue);         end;       \/\/ BOOLEAN       SQL_BOOLEAN:         begin           BooleanValue := PBoolean(pData)^;           jsonObject.AddPair(FieldName, TJsonBool.Create(BooleanValue));         end;       \/\/ BLOB       SQL_BLOB, SQL_QUAD:         begin           BlobSubtype := AMeta.getSubType(AStatus, i);           blobId := ISC_QUADPtr(pData);           att := AContext.getAttachment(AStatus);           tra := AContext.getTransaction(AStatus);           blob := att.openBlob(AStatus, tra, blobId, 0, nil);           if BlobSubtype = 1 then           begin             \/\/ \u0442\u0435\u043a\u0441\u0442             charset := TFBCharSet(AMeta.getCharSet(AStatus, i));             \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u043e\u0442\u043e\u043a \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439             textStream := TStringStream.Create('', charset.GetCodePage);             try               blob.SaveToStream(AStatus, textStream);               StringValue := textStream.DataString;             finally               textStream.Free;               blob.release;               tra.release;               att.release             end;           end           else           begin             \/\/ \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0434\u0442\u0438\u043f\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c\u0438             binaryStream := TBytesStream.Create;             try               blob.SaveToStream(AStatus, binaryStream);               \/\/ \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 base64               StringValue := TNetEncoding.Base64.EncodeBytesToString                 (binaryStream.Memory, binaryStream.Size);             finally               binaryStream.Free;               blob.release;               tra.release;               att.release             end;           end;           jsonObject.AddPair(FieldName, StringValue);         end;      end;   end;   \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Json \u0432 \u043c\u0430\u0441\u0441\u0438\u0432   AJson.AddElement(jsonObject); end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 TFbType \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 <code>Firebird.pas<\/code>.<br \/>  \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c<br \/>  <a href=\"https:\/\/github.com\/sim1984\/udr-book\/blob\/master\/examples\/Common\/FbTypes.pas\">FbTypes<\/a> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 TFBCharSet \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 <code>Firebird.pas<\/code>.<br \/>  \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c<br \/>  <a href=\"https:\/\/github.com\/sim1984\/udr-book\/blob\/master\/examples\/Common\/FbCharsets.pas\">FbCharsets<\/a> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043e \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d<br \/>  \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u0435\u043b\u043f\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f<br \/>  \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445,<br \/>  \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <code>TEncoding<\/code> \u0432 \u043d\u0443\u0436\u043d\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f<br \/>  \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u0430\u0439\u0442 \u0432 \u044e\u043d\u0438\u043a\u043e\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 Delphi.<\/p><\/blockquote>\n<p>\u0414\u043b\u044f \u0441\u0442\u0440\u043e\u043a \u0442\u0438\u043f\u0430 CHAR \u0438 VARCHAR \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 OCTETS, \u0442\u043e \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c base64, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 Delphi. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u0438\u043f\u0430 VARCHAR \u043f\u0435\u0440\u0432\u044b\u0435 2 \u0431\u0430\u0439\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u0445.<\/p>\n<p>  <\/p>\n<p>\u0422\u0438\u043f\u044b SMALLINT, INTEGER, BIGINT \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0442\u0430\u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438. \u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u0447\u0438\u0441\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>getScale<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IMessageMetadata<\/code>. \u0415\u0441\u043b\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043d\u0435 \u0440\u0430\u0432\u0435\u043d 0, \u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0447\u0438\u0441\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>MakeScaleInteger<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0422\u0438\u043f\u044b DATE, TIME \u0438 TIMESTAMP \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>decodeDate<\/code> \u0438 <code>decodeTime<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IUtil<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0447\u0430\u0441\u0442\u0438 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u044b-\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c Delphi \u0442\u0438\u043f\u0435 <code>TDateTime<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0442\u0438\u043f\u043e\u043c BLOB \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0442\u043e\u043a\u0438 Delphi. \u0415\u0441\u043b\u0438 BLOB \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u043e\u0442\u043e\u043a \u0442\u0438\u043f\u0430 <code>TBytesStream<\/code>. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 base64. \u0415\u0441\u043b\u0438 BLOB \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a <code>TStringStream<\/code> \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0447\u0435\u0441\u0442\u044c \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u041a\u043e\u0434\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 BLOB<br \/>  \u043f\u043e\u043b\u044f.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043c\u043e\u044f \u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c UDR \u0434\u043b\u044f Firebird, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d() } } }t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>      <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/455375\/\"> https:\/\/habr.com\/ru\/post\/455375\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\">\n<p>\u0412 Firebird \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u0432\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044f\u0437\u044b\u043a\u0430 PSQL \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u2014 UDF (User Defined Functions). UDF \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412 Firebird 3.0 \u0431\u044b\u043b\u0430 \u0432\u0432\u0435\u0434\u0435\u043d\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Firebird. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f External Engine (\u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u043a\u0438). \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c UDR (User Defined Routines \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u0432\u0438\u0436\u043a\u0430 FirebirdExternal. <\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c UDR, \u043e \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u0445, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f UDR \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Pascal. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e API.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-294750","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/294750","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=294750"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/294750\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=294750"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=294750"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=294750"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}