python - 在 PostgreSQL 中创建存储过程时出错

标签 python postgresql

我需要在 PostgreSQL 数据库中创建一个存储过程来获取记录,但出现以下错误。

关于如何解决它有什么建议吗?

注意:最终我希望在 PYTHON 脚本中调用此存储过程并获取所有记录并在 python 中处理它并将其插入到远程 MySQL 数据库中。

ERROR:  syntax error at or near "("
LINE 7:  WITH reference AS (select cast(origin as text) as origin, M...
              ^
CONTEXT:  invalid type name "reference AS (select cast(origin as text) as origin, MAX(case when name like '%PICK%' THEN name else null end) as "Pick_ref"
                                                  , MAX(case when name like '%OUT%' THEN name else null end) as "Pack_ref"
                                                  , MAX(case when name like '%PICK%' THEN state else null end) as "Pick_State"
                                                 , MAX(case when name like '%OUT%' THEN state else null end) as "Pack_State"

                    , MAX(case when name like '%PICK%' THEN date_done else null end) as "Pick_State_Done"
                    , MAX(case when name like '%OUT%' THEN date_done else null end) as "Pack_State_Done"
                     from dl_odoo.stock_picking  
                                 GROUP BY origin)
"
SQL state: 42601
Character: 127

这是我需要创建的完整 SP 代码,

CREATE OR REPLACE PROCEDURE public.sync( )
LANGUAGE 'plpgsql'

AS $BODY$
DECLARE  start_time              TIMESTAMPTZ;
 WITH reference AS (select cast(origin as text) as origin, MAX(case when name like '%PICK%' THEN name else null end) as "Pick_ref"
                                                  , MAX(case when name like '%OUT%' THEN name else null end) as "Pack_ref"
                                                  , MAX(case when name like '%PICK%' THEN state else null end) as "Pick_State"
                                                 , MAX(case when name like '%OUT%' THEN state else null end) as "Pack_State"

                    , MAX(case when name like '%PICK%' THEN date_done else null end) as "Pick_State_Done"
                    , MAX(case when name like '%OUT%' THEN date_done else null end) as "Pack_State_Done"
                     from dl_odoo.stock_picking  
                                 GROUP BY origin)
,tracking_details as
(
 select magento_order_number,tracking_number,tracking_link,send_at from  staging.hermes_tracking_report
 UNION
 select magento_order_number,tracking_number,tracking_link,send_at from  staging.dhl_tracking_report
)
,temp_out as
(
SELECT   DISTINCT   o.order_id,o.order_number AS "order_number",o.customer_email
          ,sp.sale_id as "Odoo Sale ID"
          ,COALESCE(rp.name,c.first_name||' '||c.last_name) customer_name
          ,o.created_at_order "Order_date"
          ,o.order_state_1 "order_state_1"
          ,o.order_state_2 "order_state_2"
          ,o.payment_method,o.order_subtotal
          ,o.shipping_country_id
          ,COALESCE(dc.name,o.shipping_description ) as "Carrier"
          ,COALESCE(so.date_order) AS "Odoo_Order_date",
          COALESCE(so.mage_state) AS "Odoo_Mage_state",
          COALESCE(so.mage_status) AS "Odoo_Mage_status",
          CASE
              WHEN o.invoice_state=1 THEN 'OPEN'
              WHEN o.invoice_state=2 THEN 'PAID'
              WHEN o.invoice_state=3 THEN 'CANCELED'
              ELSE ''
          END AS "Mage_Invoice_state",
          COALESCE(so.invoice_status ) AS "Odoo_Invoice_status"

         ,so.state as "odoo_sale_state"
         ,"Pick_ref","Pack_ref","Pick_State",r."Pick_State_Done","Pack_State",r."Pack_State_Done"
         ,td.tracking_number,td.tracking_link,td.send_at as "Tracking_info_send_at"
         ,CASE WHEN 
              ("Pick_State" ='done'and "Pack_State"='done') 
              AND 
              (o.order_state_1 <>'complete'and o.order_state_2<>'complete') 
             THEN 'NEED TO SYNC' 
             WHEN 
              ("Pick_State" <>'done' Or "Pack_State"<>'done') 
              AND (o.order_state_1 <>'complete'and o.order_state_2<>'complete') 
              THEN 'Stll Processing'
             END as "SYNC Status"
    ,0 as shipment_status
FROM ol.orders o
   LEFT JOIN dl_odoo.sale_order so ON 
   o.order_number= so.name 
   LEFT JOIN ol.customers c on c.customer_email=o.customer_email
   LEFT JOIN dl_odoo.res_partner rp on rp.id=so.partner_id
   LEFT JOIN dl_odoo.sale_order so_2 ON o.order_number=so_2.name
   LEFT JOIN dl_odoo.sale_order_line sol ON sol.id=so.id
   LEFT JOIN dl_odoo.delivery_carrier dc on so.carrier_id=dc.id
   LEFT JOIN  dl_odoo.stock_picking sp on o.order_number=sp.origin
   LEFT JOIN reference r on r.origin=o.order_number
   LEFT JOIN tracking_details td on td.magento_order_number=o.order_number
   WHERE TO_CHAR("o"."created_at_order" ,'YYYY-MM') BETWEEN TO_CHAR(now() - INTERVAL '44 days','YYYY-MM') AND TO_CHAR(now(),'YYYY-MM')
   AND "o"."order_state_2"<>'canceled'
            AND "o"."order_state_2" <> 'pending_payment'
            AND "o"."order_state_1" <> 'canceled'
            AND "o"."order_state_1" <> 'pending_payment'
            AND "o"."order_state_1" <> 'closed'
            AND "o"."order_state_2" <> 'closed'
            AND "o".payment_method ILIKE '%bankpayment%'
  ) 
 ,odoo_cancel as
 (
 SELECT  "order_id",'canceled' as status
                  ,'canceled' as state
 FROM temp_out
 WHERE odoo_sale_state='cancel' 
     )
,odoo_complete as
 (
 SELECT  "order_id",'complete' as status
                   ,'complete' as state
                   ,tracking_number,shipment_status
 FROM temp_out
 WHERE "Pack_State"='done'
     )
SELECT  'cancel' as state, now() as created_at,'{"action":"updateOrder",' || json_build_object('data',row_to_json(row)) || '}'  
from (select * from odoo_cancel) row  as payload

UNION

SELECT 'complete' as state,now() as created_at,'{"action":"updateOrder",' || json_build_object('data',row_to_json(row)) || '}'  
from (select * from odoo_complete) row 

END
$BODY$;

最佳答案

DECLARE 部分后缺少 BEGIN

关于python - 在 PostgreSQL 中创建存储过程时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58504269/

相关文章:

python - 使用 Python 水平扩展或分片 Python-RQ 或 Redis

python - 在 wx.panel : Show only small region of the video 中使用带有 python 和 wxPython 的 OpenCV 显示 VideoCapture

python - 删除全为零的字符串 - pandas python

postgresql - 在 Postgres 中使用可序列化事务级别的意外失败

sql - "distinct on"与 postgres 组

python - Pandas 根据许多其他列的条件逻辑添加一个新列

python - 向python对象添加属性

postgresql - PostgreSQL 中的计数问题

php - 有没有办法用 Postgres 存储阿拉伯日期?

r - 如何将 postgresql 数据中的数据提取到数据框中以与 sqldf 一起使用