臻嵘岁月 2023-11-21 18:08
浏览 18
已结题

thinkphp5.1连接人大金仓数据库报语法错误

thinkphp5.1连接人大金仓数据库报语法错误
以下是生成的SQL语句
select fields_name as "field",fields_type as "type",fields_not_null as "null",fields_key_name as "key",fields_default as "default",fields_default as "extra" from table_msg('cw_admin_log');

错误: 语法错误 在 "false" 或附近的
LINE 1: false
^
QUERY: false
CONTEXT: PL/SQL函数table_msg(varchar,varchar)的第43行的在EXECUTE语句上的FOR语句
PL/SQL函数table_msg(varchar)的第5行的在SELECT记录上的FOR语句
时间: 0.001s
kingbase驱动复制的pgsql驱动

以下是导入的SQL语句


```sql
CREATE OR REPLACE FUNCTION pgsql_type(a_type varchar) RETURNS varchar AS
$$
DECLARE
     v_type varchar;
BEGIN
     IF a_type='int8' THEN
          v_type:='bigint';
     ELSIF a_type='int4' THEN
          v_type:='integer';
     ELSIF a_type='int2' THEN
          v_type:='smallint';
     ELSIF a_type='bpchar' THEN
          v_type:='char';
     ELSE
          v_type:=a_type;
     END IF;
     RETURN v_type;
END;
$$
LANGUAGE plsql;
CREATE TYPE "public"."tablestruct" AS (
  "fields_key_name" varchar(100),
  "fields_name" VARCHAR(200),
  "fields_type" VARCHAR(20),
  "fields_length" BIGINT,
  "fields_not_null" VARCHAR(10),
  "fields_default" VARCHAR(500),
  "fields_comment" VARCHAR(1000)
);
CREATE OR REPLACE FUNCTION "public"."table_msg" (a_schema_name varchar, a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS
$$
DECLARE
     v_ret tablestruct;
     v_oid oid;
     v_sql varchar;
     v_rec RECORD;
     v_key varchar;
     v_num INTEGER;
BEGIN
     SELECT
           sys_class.oid  INTO v_oid
     FROM
           sys_class
           INNER JOIN sys_namespace ON (sys_class.relnamespace = sys_namespace.oid AND lower(sys_namespace.nspname) = a_schema_name)
     WHERE
           sys_class.relname=a_table_name;
     IF NOT FOUND THEN
         RETURN;
     END IF;
     v_sql='
     SELECT
           sys_attribute.attname AS fields_name,
           sys_attribute.attnum AS fields_index,
           pgsql_type(sys_type.typname::varchar) AS fields_type,
           sys_attribute.atttypmod-4 as fields_length,
           CASE WHEN sys_attribute.attnotnull  THEN ''not null''
           ELSE ''''
           END AS fields_not_null,
           sys_description.description AS fields_comment
     FROM
           sys_attribute
           INNER JOIN sys_class  ON sys_attribute.attrelid = sys_class.oid
           INNER JOIN sys_type   ON sys_attribute.atttypid = sys_type.oid
           LEFT OUTER JOIN sys_attrdef ON sys_attrdef.adrelid = sys_class.oid AND sys_attrdef.adnum = sys_attribute.attnum
           LEFT OUTER JOIN sys_description ON sys_description.objoid = sys_class.oid AND sys_description.objsubid = sys_attribute.attnum
     WHERE
           sys_attribute.attnum > 0
           AND attisdropped <> ''t''
           AND sys_class.oid = ' || v_oid || '
     ORDER BY sys_attribute.attnum';
     FOR v_rec IN EXECUTE v_sql LOOP
         v_ret.fields_name=v_rec.fields_name;
         v_ret.fields_type=v_rec.fields_type;
         IF v_rec.fields_length > 0 THEN
            v_ret.fields_length:=v_rec.fields_length;
         ELSE
            v_ret.fields_length:=NULL;
         END IF;
         v_ret.fields_not_null=v_rec.fields_not_null;
         v_ret.fields_comment=v_rec.fields_comment;
         SELECT count(*) INTO v_num FROM information_schema.key_column_usage WHERE table_schema=a_schema_name AND table_name=a_table_name AND column_name=v_rec.fields_name;
         IF v_num > 0 THEN
            SELECT constraint_name INTO v_key FROM information_schema.key_column_usage WHERE table_schema=a_schema_name AND table_name=a_table_name AND column_name=v_rec.fields_name;
            v_ret.fields_key_name=v_key;
         ELSE
            v_ret.fields_key_name='';
         END IF;
         RETURN NEXT v_ret;
     END LOOP;
     RETURN ;
END;
$$
LANGUAGE 'plsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
COMMENT ON FUNCTION "public"."table_msg"(a_schema_name varchar, a_table_name varchar)
IS '获得表信息';
---重载一个函数
CREATE OR REPLACE FUNCTION "public"."table_msg" (a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS
$$
DECLARE
    v_ret tablestruct;
BEGIN
    FOR v_ret IN SELECT * FROM table_msg('public',a_table_name) LOOP
        RETURN NEXT v_ret;
    END LOOP;
    RETURN;
END;
$$
LANGUAGE 'plsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

COMMENT ON FUNCTION "public"."table_msg"(a_table_name varchar)
IS '获得表信息';

```

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月29日
    • 修改了问题 11月22日
    • 创建了问题 11月21日

    悬赏问题

    • ¥15 (标签-考研|关键词-set)
    • ¥15 求修改代码,图书管理系统
    • ¥15 请问有没求偏多标签数据集yeast,reference,recreation,scene,health数据集。
    • ¥15 传感网应用开发单片机实训
    • ¥15 Delphi 关于sAlphaImageList使用问题
    • ¥15 寻找将CAJ格式文档转txt文本的方案
    • ¥15 shein测试开发会问些啥我是写java的
    • ¥15 关于#单片机#的问题:我有个课程项目设计,我想在STM32F103veTX单片机,M3主控模块上设计一个程序,在Keil uVision5(C语言)上代码该怎么编译?(嫌钱少我可以加钱,急急急)
    • ¥15 opnet仿真网络协议遇到问题
    • ¥15 在安装python的机器学习程序包scikit-learn(1.1版本)时遇到如下问题