WITH temp AS (\n\t\t\tSELECT id, DEPARTMENT,\n\t\t\t\t\tREGEXP_SUBSTR(DEPARTMENT, "[^,]+", 1, LEVEL) AS single_dept_id,\n\t\t\t\t\tCREATE_BY ,\n\t\t\t\t\tLEVEL AS dept_level\n\t\t\tFROM R_TRAINING_PLAN_T \n\t\t\tCONNECT BY id = PRIOR id\n\t\t\t\t\t\tAND REGEXP_SUBSTR(DEPARTMENT, "[^,]+", 1, LEVEL) IS NOT NULL\n\t\t\t\t\t\tAND PRIOR sys_guid() IS NOT NULL\n\t\t) \nSELECT id, single_dept_id AS dept_id,CREATE_BY \nFROM temp\nORDER BY id, dept_level \nINSERT INTO R_DEPT_CONTROL_INFO (id,course_id,dept_id,del_flag,create_dt,create_by,last_edit_dt,last_edit_by,courese_type)\nVALUES(SEQ_R_DEPT_CONTROL_INFO_ID.nextval,id,dept_id,"0",sysdate,create_by,sysdate,create_by,"1");\n\n上面的语句存在以下问题:\n\n1. 在WITH子句中,使用了CONNECT BY子句,但没有指定根节点。这可能导致循环连接或无限递归。需要指定一个根节点或使用其他方法来避免循环连接。\n\n2. 在INSERT语句中,使用了未定义的变量id。需要确保在此之前已经定义了id的值。\n\n3. 在INSERT语句中,使用了未定义的序列SEQ_R_DEPT_CONTROL_INFO_ID.nextval。需要确保该序列已经存在,并且具有适当的权限。\n\n4. 在INSERT语句中,使用了未定义的变量create_by。需要确保在此之前已经定义了create_by的值。\n\n解决方案:\n\n1. 确定CONNECT BY子句的根节点,例如使用WHERE子句限定根节点的条件,比如 id = 'root'。\n\n2. 确保在INSERT语句之前定义了变量id,并且具有合适的值。\n\n3. 确保SEQ_R_DEPT_CONTROL_INFO_ID序列已经存在,并且具有适当的权限。\n\n4. 确保在INSERT语句之前定义了变量create_by,并且具有合适的值。如果create_by是一个列名,需要确保在SELECT语句中选择了相应的列。\n\n最终修正后的代码可能如下所示:\n\nWITH temp AS (\n\t\t\tSELECT id, DEPARTMENT,\n\t\t\t\t\tREGEXP_SUBSTR(DEPARTMENT, "[^,]+", 1, LEVEL) AS single_dept_id,\n\t\t\t\t\tCREATE_BY ,\n\t\t\t\t\tLEVEL AS dept_level\n\t\t\tFROM R_TRAINING_PLAN_T \n\t\t\tWHERE id = 'root' -- 根节点条件\n\t\t\tCONNECT BY id = PRIOR id\n\t\t\t\t\t\tAND REGEXP_SUBSTR(DEPARTMENT, "[^,]+", 1, LEVEL) IS NOT NULL\n\t\t\t\t\t\tAND PRIOR sys_guid() IS NOT NULL\n\t\t) \nSELECT id, single_dept_id AS dept_id,CREATE_BY \nFROM temp\nORDER BY id, dept_level;\n\nINSERT INTO R_DEPT_CONTROL_INFO (id,course_id,dept_id,del_flag,create_dt,create_by,last_edit_dt,last_edit_by,courese_type)\nVALUES(SEQ_R_DEPT_CONTROL_INFO_ID.nextval, :id, :dept_id, "0", sysdate, :create_by, sysdate, :create_by, "1");

SQL语句优化:CONNECT BY子句、变量定义和序列问题

原文地址: https://www.cveoy.top/t/topic/mwRp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录