Teiid рдХреЗ рд▓рд┐рдП рдирдП рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд, рднрд╛рдЧ 2: рдЕрдиреБрд╡рд╛рджрдХ рд▓рд┐рдЦрдирд╛

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ DDL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрдЦрд╛ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╕реНрд░реЛрдд рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рдкреНрд░рддреНрдпрдХреНрд╖ рдбреЗрдЯрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ? рдХреНрдпрд╛ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдпрд╛ рдЗрдирд▓рд╛рдЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП? рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ: рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд▓рд┐рдЦреЗрдВред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ 4 рднрд╛рдЧ (рд╡рд░реНрдЧ) рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ ExecutionFactory рд╡рд░реНрдЧ рдФрд░ ResultSetExecution , ProcedureExecution рдФрд░ UpdateExecution рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ UpdateExecution ; рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддреАрдж рдЕрдиреБрд╡рд╛рджрдХ рдПрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ (рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░) рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдЪрд▓реЛ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдкреБрд░реНрдЬреЗ



рдЖрдЧреЗ рд╣рдо рдЗрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред

рдореВрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрд╕


рд╣рдорд╛рд░реЗ рдЕрдиреБрд╡рд╛рджрдХ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреАрдИрдж рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рдЬрд╛рд░ рдореЗрдВ рдореМрдЬреВрдж рдореЗрдЯрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП META-INF \ services \ org.teiid.translator.ExecutionFactory рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд▓рд╛рдЗрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
 ru.habrahabr.HabrExecutionFactory 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, JBoss 7 рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ JBOSS_HOME% / рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди / рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди / рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди.xml (рдпрд╛ [..] рдбреЛрдореЗрди [..] рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
 <subsystem xmlns="urn:jboss:domain:teiid:1.0"> [..] <translator name="habrahabr" module="ru.habrahabr"/> [..] 

рдпрд╣рд╛рдВ рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрдХ рдХрд┐рд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд╕рд╛рде рдЬрд╛рд░ рдХреЛ ru.habrahabr рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░ рдпрд╣рд╛рдВ, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рддрд░рд╣, рд╣рдореЗрдВ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
 <subsystem xmlns="urn:jboss:domain:resource-adapters:1.0"> [...] <resource-adapters> <resource-adapter> <archive>teiid-connector-ws.rar</archive> <transaction-support>NoTransaction</transaction-support> <connection-definitions> <connection-definition class-name="org.teiid.resource.adapter.ws.WSManagedConnectionFactory" jndi-name="java:/habrDS" enabled="true" use-java-context="true" pool-name="habr-ds"> <config-property name="EndPoint">http://habrahabr.ru/api/profile/</config-property> </connection-definition> </connection-definitions> </resource-adapter> </resource-adapters> [...] 


рдореЙрдбрд▓ рд╡рд┐рд╡рд░рдг


рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рдпрдВ рдпрд╛ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ vdb рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбрд▓ рд╡рд┐рд╡рд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
  <model name="habr"> <source name="habr" translator-name="habrahabr" connection-jndi-name="java:/habrDS"/> </model> 

рд╡рд╣ рд╕рдм рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрдиреБрд╡рд╛рджрдХ-рд╡рд╛рд░рд┐рд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
  <model name="habr"> <source name="habr" translator-name="habrahabr2" connection-jndi-name="java:/habrDS"/> </model> <translator name="habrahabr2" type="habrahabr"> <property name="defaultUser" value="elfuegobiz"/> </translator> 


рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдФрд░ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реА рдЬрд╛рдПрдЧреА:
  <model name="habr"> <source name="habr" translator-name="habrahabr2" connection-jndi-name="java:/habrDS"/> <property name="importer.convertToUppercase" value="true"/> </model> <translator name="habrahabr2" type="habrahabr"> <property name="defaultUser" value="elfuegobiz"/> </translator> 


ExecutionFactory


рдпрд╣рд╛рдБ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
  1. рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдирд╛рдо рдФрд░ рд╡рд┐рд╡рд░рдг рд╕реЗрдЯ рдХрд░реЗрдВред
  2. рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВред
  3. рдПрд╕рдХреНрдпреВрдПрд▓ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рд╣рдо рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗред
  4. рд╕рдорд░реНрдерд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдмрдирд╛рдПрдБред
  5. рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВред

рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред

рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдирд╛рдо рдФрд░ рд╡рд┐рд╡рд░рдг


 package ru.habrahabr; import javax.resource.cci.ConnectionFactory; import org.teiid.translator.ExecutionFactory; import org.teiid.translator.Translator; import org.teiid.translator.WSConnection; @Translator(name = "habrahabr", description = "A translator for Habrahabr API") public class HabrExecutionFactory extends ExecutionFactory<ConnectionFactory, WSConnection> { } 

Translator рдПрдиреЛрдЯреЗрд╢рди рд╡рд░реНрдЧ рдХреЛ Translator рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ, name рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣ name рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдФрд░ description - рдПрдХ рдордирдорд╛рдирд╛ рдкрд╛рда рд╡рд┐рд╡рд░рдгред рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдорд╛рдирдХ WS рдХрдиреЗрдХреНрдЯрд░ Teiid рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдЧреБрдг


рдКрдкрд░, рдЕрдзреНрдпрд╛рдп "рдореЙрдбрд▓ рд╡рд┐рд╡рд░рдг" рдореЗрдВ рд╣рдордиреЗ defaultUser рд▓рд┐рдП defaultUser рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ред рдЕрдм рд╣рдо рдЗрд╕реЗ рдЕрдиреБрд╡рд╛рджрдХ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
 import org.teiid.translator.TranslatorProperty; [..] private String defaultUser; @TranslatorProperty(description="Default user name", display="Default user name to use for table queries", required=true) public String getDefaultUser() { return defaultUser; } public void setDefaultUser(String defaultUser) { this.defaultUser = defaultUser; } 

рдкреНрд░рд╛рдкрдХ рдХреЗ рд▓рд┐рдП TranslatorProperty рдПрдиреЛрдЯреЗрд╢рди рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдЖрдк рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ required=true рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдиреБрд╡рд╛рджрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп, Teiid рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ vdb рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрдХ рд╡рд┐рд╡рд░рдг рд╕реЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рднрд░ рджреЗрдЧрд╛ред

SQL рдирд┐рд░реНрдорд╛рдг рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ


ExecutionFactory рд╡рд░реНрдЧ рдореЗрдВ рдХрдИ рд╕рдорд░реНрдерд┐рдд рдорд╛рд╕реНрдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ supports* рдЬреЛ рдПрдХ boolean рдорд╛рди boolean рдЬреЛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд╡рд╛рджрдХ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдиреБрд╡рд╛рджрдХ рдЬрд┐рд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЕрдиреБрд╡рд╛рджрдХ рд╕рдореБрдЪреНрдЪрдп рдлрд╝рдВрдХреНрд╢рди sum() рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рддреЛ Teiid рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╡рд╣ рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред

рдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреЗрд╡рд▓ рдХреБрдЫ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдирд┐рдкрдЯрд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо count(*) рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ limit <> рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдирдореЗрдВ true рд╡рд╛рдкрд╕реА рдХрд░реЗрдВрдЧреЗ:
  @Override public boolean supportsAggregatesCountStar() { return true; } @Override public boolean supportsRowLimit() { return true; } 

рдпрд╣ рдЗрди рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЕрдЧрд░ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдореЗрдВ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдЕрдиреБрд╡рд╛рджрдХ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдВрдЧреЗ - рд╕реНрд░реЛрдд рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрд╡рд╛рджрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рджрд░реНрд╢рдХ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред

рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛


рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ExecutionFactory getMetadata(MetadataFactory metadataFactory, WSConnection conn) рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ getMetadata(MetadataFactory metadataFactory, WSConnection conn) рд╡рд┐рдзрд┐ getMetadata(MetadataFactory metadataFactory, WSConnection conn) , рдЬрд┐рд╕реЗ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ MetadataFactory рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯреЗрдмрд▓, рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╣рдорд╛рд░реА рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдХрдиреЗрдХреНрд╢рди рдХреА рдПрдХ рд╡рд╕реНрддреБ рд╣реИ: рдЕрдЧрд░ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╕реНрд░реЛрдд рд╕реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдирд╛рдоред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
  @Override public void getMetadata(MetadataFactory metadataFactory, WSConnection conn) throws TranslatorException { Table table = metadataFactory.addTable("habr"); metadataFactory.addColumn("login", DefaultDataTypes.STRING, table); metadataFactory.addColumn("karma", DefaultDataTypes.FLOAT, table); metadataFactory.addColumn("rating", DefaultDataTypes.FLOAT, table); metadataFactory.addColumn("ratingposition", DefaultDataTypes.LONG, table); Procedure proc = metadataFactory.addProcedure("getHabr"); metadataFactory.addProcedureParameter("username", TypeFacility.RUNTIME_NAMES.STRING, Type.In, proc); metadataFactory.addProcedureParameter("ratingposition", TypeFacility.RUNTIME_NAMES.LONG, Type.ReturnValue, proc); metadataFactory.addProcedureParameter("rating", TypeFacility.RUNTIME_NAMES.FLOAT, Type.ReturnValue, proc); metadataFactory.addProcedureParameter("karma", TypeFacility.RUNTIME_NAMES.FLOAT, Type.ReturnValue, proc); metadataFactory.addProcedureParameter("login", TypeFacility.RUNTIME_NAMES.STRING, Type.ReturnValue, proc); } 

рд╣рдордиреЗ рдЪрд╛рд░ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЪрд╛рд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рддрд╛рд▓рд┐рдХрд╛ defaultUser рдбреЗрдЯрд╛ defaultUser - рд╡рд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЕрдиреБрд╡рд╛рджрдХ рдХреЛ рд╕реМрдВрдкрд╛ рдерд╛ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрдИ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдХреЛрд╖реНрдардХ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рди рдХреЗрд╡рд▓ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рдиреЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛ рд╕рдХрддреА рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рднреА, рдЬреИрд╕реЗ рдХрд┐ ResultSetExecution : рдЗрд╕рдХреЗ рд▓рд┐рдП, рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ Type.Result рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ next() рд╡рд┐рдзрд┐ рднреА рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рд╕рдВрдЪрд╛рд▓рдХреЛрдВ


рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдХреЙрд▓ рдФрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╣рдорд╛рд░реА рдЯреЗрдмрд▓ рдкрд░ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рд╕реЗред
  public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, WSConnection connection) throws TranslatorException { return new HabrResultSetExecution((Select) command, connection); } public ProcedureExecution createProcedureExecution(Call command, ExecutionContext executionContext, RuntimeMetadata metadata, WSConnection connection) throws TranslatorException { return new HabrProcedureExecution(command, connection); } 

рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдЯреЗрдмрд▓ рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВрдбрд▓рд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрди рддрд░реАрдХреЛрдВ рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
  public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, WSConnection connection) throws TranslatorException { String tableName = ((NamedTable) command.getProjectedQuery().getFrom().get(0)). getMetadataObject().getName(); if ("habr".equalsIgnoreCase(tableName)) return new HabrResultSetExecution((Select) command, connection); if ("hrenabr".equalsIgnoreCase(tableName)) return new HrenabrResultSetExecution((Select) command, connection); return null; } public ProcedureExecution createProcedureExecution(Call command, ExecutionContext executionContext, RuntimeMetadata metadata, WSConnection connection) throws TranslatorException { if ("getHabr".equalsIgnoreCase(command.getProcedureName())) return new HabrProcedureExecution(command, connection); if ("getHrenabr".equalsIgnoreCase(command.getProcedureName())) return new HrenabrProcedureExecution(command, connection); return null; } 

рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ: рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рдЕрд░реЗ рд╣рд╛рдВ ... рдереЛрдбрд╝рд╛ рд╕реНрдЯреНрд░реАрдЯ рдореИрдЬрд┐рдХ


рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдиреЗ рд╢рд╛рдпрдж рдпрд╣ рджреЗрдЦрд╛ рдХрд┐ рдЕрднреА рддрдХ рд╣рдордиреЗ importer.convertToUppercase рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред Teiid рдХреЛрдб рдЗрд╕ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 [..] private boolean convertToUppercase; public boolean isConvertToUppercase() { return convertToUppercase; } public void setConvertToUppercase(boolean convertToUppercase) { this.convertToUppercase = convertToUppercase; } [..] @Override public void getMetadata(MetadataFactory metadataFactory, WSConnection conn) throws TranslatorException { [..] PropertiesUtils.setBeanProperties(this, metadataFactory.getImportProperties(), "importer"); } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, PropertiesUtils.setBeanProperties рд╡рд┐рдзрд┐ metadataFactory.getImportProperties() MetadataFactory рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЧрдИ рдЧреБрдгреЛрдВ рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдореЙрдбрд▓ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ metadataFactory.getImportProperties() рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд╛рддрд╛ рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рдЬрд╛рдБрдЪ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ POJO рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рднрд░реЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдореБрдлреНрдд рдореЗрдВ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдорд┐рд▓рддрд╛ рд╣реИред

ResultSetExecution


рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧреА рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐ HabrExecutionFactory рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ HabrExecutionFactory рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝ HabrExecutionFactory ред
рдпрд╣ рд╣рдорд╛рд░реА convertToUppercase рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдореВрд▓реНрдп рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ convertToUppercase рд╣реИ рдФрд░ рдпрджрд┐ true рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ true , рддреЛ рд▓реЙрдЧрд┐рди рдЕрдкрд░рдХреЗрд╕ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
  protected List<Object> extractResult(DataSource dataSource) throws TranslatorException { List<Object> results = new ArrayList<Object>(); try { DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; builder = xmlFact.newDocumentBuilder(); Document doc = builder.parse(dataSource.getInputStream()); dataSource.getInputStream().close(); final XPath xpath = XPathFactory.newInstance().newXPath(); Node node = (Node) xpath.compile("/habrauser/login").evaluate(doc, XPathConstants.NODE); String login = node.getTextContent(); if (convertToUppercase) login = login.toUpperCase(); results.add(login); node = (Node) xpath.compile("/habrauser/karma").evaluate(doc, XPathConstants.NODE); results.add(Float.valueOf(node.getTextContent())); node = (Node) xpath.compile("/habrauser/rating").evaluate(doc, XPathConstants.NODE); results.add(Float.valueOf(node.getTextContent())); node = (Node) xpath.compile("/habrauser/ratingPosition").evaluate(doc, XPathConstants.NODE); results.add(Long.valueOf(node.getTextContent())); } catch (Exception e) { throw new TranslatorException(e); } return results; } 

рдЕрдм рдЖрдк HabrResultSetExecution рд╡рд░реНрдЧ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
  public class HabrResultSetExecution implements ResultSetExecution { private final WSConnection conn; private boolean closed; private DataSource dataSource; public HabrResultSetExecution(Select query, WSConnection conn) { this.conn = conn; } @Override public void execute() throws TranslatorException { closed = false; try { Dispatch<DataSource> dispatch = conn.createDispatch(HTTPBinding.HTTP_BINDING, defaultUser, DataSource.class, Mode.MESSAGE); dispatch.getRequestContext().put(MessageContext.HTTP_REQUEST_METHOD, "GET"); dataSource = dispatch.invoke(null); } catch (Exception e) { throw new TranslatorException(e); } } @Override public List<?> next() throws TranslatorException, DataNotAvailableException { if (closed) return null; closed = true; return extractResult(dataSource); } @Override public void close() { closed = true; } @Override public void cancel() throws TranslatorException { closed = true; } } 

рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ execute() рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╡рд╣ рдЙрд╕реЗ рджрд┐рдП рдЧрдП рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо next() рд╡рд┐рдзрд┐ рдХреЛ рддрдм рддрдХ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ null ред рдкрд╣рд▓реА рдХреЙрд▓ рдореЗрдВ, рд╡рд┐рдзрд┐ рд╕рдВрдЧреНрд░рд╣рд┐рдд DataSource рдХреЛ extractResult() рд╡рд┐рдзрд┐ рд╕реЗ extractResult() рдХрд░рддреА рд╣реИ, рдЬреЛ рд╕рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рдПрдХ рдбреЗрдЯрд╛ рдкрдВрдХреНрддрд┐ рднреА рдмрдирд╛рддреА рд╣реИ: List<?> , рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдХреА рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ, рджреВрд╕рд░реА рдФрд░ рдмрд╛рдж рдХреА рдХреЙрд▓ рдкрд░ рд╣рдо null ред

ProcedureExecution


рдпрд╣ рд╡рд░реНрдЧ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рджреЛ рдЕрдВрддрд░ рд╣реИрдВ:

  public class HabrProcedureExecution implements ProcedureExecution { private final Call procedure; private final WSConnection conn; private DataSource dataSource; public HabrProcedureExecution(Call procedure, WSConnection conn) { this.procedure = procedure; this.conn = conn; } @Override public void execute() throws TranslatorException { List<Argument> arguments = this.procedure.getArguments(); String username = (String) arguments.get(0).getArgumentValue().getValue(); try { Dispatch<DataSource> dispatch = conn.createDispatch(HTTPBinding.HTTP_BINDING, username, DataSource.class, Mode.MESSAGE); dispatch.getRequestContext().put(MessageContext.HTTP_REQUEST_METHOD, "GET"); dataSource = dispatch.invoke(null); } catch (Exception e) { throw new TranslatorException(e); } } @Override public List<?> getOutputParameterValues() throws TranslatorException { return extractResult(dataSource); } @Override public List<?> next() throws TranslatorException, DataNotAvailableException { return null; } @Override public void close() { } @Override public void cancel() throws TranslatorException { } } 


UpdateExecution


рд╣рдо рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рджрд░реНрд╢рдХ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рддреЛ рд╣рдо рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖ рдЧрдПред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдЪреАрдЬреЗрдВ рд╣реИрдВ:
  1. рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдЕрдорд▓ рдХрд░реЗрдВ:
     select * from habr.habr; select w.* from (call habr.getHabr(username=>'elfuegobiz')) w; 
  2. рдХрд╣реЛ: рдпрд╣ рдЕрдЪреНрдЫрд╛ рдерд╛ =)

Source: https://habr.com/ru/post/In150878/


All Articles