Greenplum获取一个SQL结果的字段名


在Greenplum中,对于任意一个SQL,我们想获取这个SQL执行后的字段名是比较难的。

比方说在写一个通用工具的时候,使用copy命令将一个SQL导出成文本,但是每个字段的名称导出的文本中却没有,如果使用自己解析SQL的话就太复杂了

如果我们想取得这些字段名的话,不真正执行sql,因为在生成执行计划的时候已经,我知道的有以下几种方法:

1.使用JDBC,prepareStatement先生成执行计划,然后获取字段名:

  1. PreparedStatement pstmt = conn.prepareStatement("select * from gp_segment_configuration a");  
  2. ResultSetMetaData metaData=pstmt.getMetaData();  
  3. for(int i=1;i<=metaData.getColumnCount();i++){  
  4.  System.out.println(metaData.getColumnName(i)+" \t\t :"+metaData.getColumnTypeName(i));  
  5. }  

ps:不止是JDBC,其他的客户端接口估计都会有这种接口将字段给取出来。看了jdbc的源码,在获取metaData信息的时候,是直接跟数据库交互,然后将这些信息接收过来的。对于其他的,应该都是有定义好的接口的,这个需要自己去挖掘。


2.explain 如果加上verbose会将整个解析后的语法数打印出来。如下:

  1. aligputf8=# explain verbose select * from cxfa;     
  2.                            QUERY PLAN                             
  3. ----------------------------------------------------------------   
  4.     {MOTION   
  5.     :motionID 1   
  6.     :motionType 1   
  7.     :sendToSecondary false   
  8.     :sendSorted false   
  9.     :numInputSegs 3   
  10.     :inputSegIdx <>   
  11.     :numHashSegs 0   
  12.     :hashSegIdx   
  13.     :hashExpr <>   
  14.     :hashDataTypes <>   
  15.     :numOutputSegs 1   
  16.     :outputSegIdx -1   
  17.     :numSortCols 0   
  18.     :sortColIdx   
  19.     :sortOperators   
  20.     :plan_node_id 1   
  21.     :plan_parent_node_id -1   
  22.     :startup_cost 0.00   
  23.     :total_cost 0.00   
  24.     :plan_rows 1   
  25.     :plan_width 36   

其中最上层的targetlist就是 SQL要返回的字段列表。

  1. :targetlist (  
  2.     {TARGETENTRY   
  3.     :expr   
  4.        {VAR   
  5.        :varno 1   
  6.        :varattno 1   
  7.        :vartype 23   
  8.        :vartypmod -1   
  9.        :varlevelsup 0   
  10.        :varnoold 1   
  11.        :varoattno 1  
  12.        }  
  13.     :resno 1   
  14.     :resname a   
  15.     :ressortgroupref 0   
  16.     :resorigtbl 28569230   
  17.     :resorigcol 1   
  18.     :resjunk false  
  19.     }  
  20.     {TARGETENTRY   
  21.     :expr   
  22.        {VAR   
  23.        :varno 1   
  24.        :varattno 2   
  25.        :vartype 25   
  26.        :vartypmod -1   
  27.        :varlevelsup 0   
  28.        :varnoold 1   
  29.        :varoattno 2  
  30.        }  
  31.     :resno 2   
  32.     :resname b   
  33.     :ressortgroupref 0   
  34.     :resorigtbl 28569230   
  35.     :resorigcol 2   
  36.     :resjunk false  
  37.     }  
  38.  )  

这样,我们能不能利用这个写一个函数,来将这个字段名给取出来呢,如果直接解析这个语法树还是比较麻烦的。我们发现,字段名前面都有一个      :resname开头,我们可以遍历这个数,把“     :resname”开头的都给找出来,就是字段名了。

  • 1
  • 2
  • 下一页

相关内容