简体   繁体   中英

MySQL / Mariadb - Select * from Stored Procedure

I am attempting to use UF Dashbuilder which adds syntax to my SQL query and I don't know how to correct it.

The call that works is similar to:

call database.report ('1234', 'txt');

Dashbuilder turns it into this which does not work:

 SELECT * FROM (call database.report ('1234', 'txt');) AS `dbSQL` LIMIT 1

I could also use the code below from the end of the stored procedure to store the results in a table and then SELECT * FROM TABLE in Dashbuilder, but I don't know how to store the results in a table (dynamic number of columns).

Can you please tell me how I can make a stored procedure work with SELECT * added or how I can store the results from this code in a table?

  SET @sql = NULL;
   SET SESSION GROUP_CONCAT_MAX_LEN = 1000000;  -- default is 1024
   SELECT
      GROUP_CONCAT(DISTINCT
         CONCAT(
            'MAX(IF(question = ''', REPLACE(question,"'", "\\'"), ''', answer, NULL)) AS ''', REPLACE(question,"'", "\\'"), ''''
         )
      ) INTO @sql
      FROM tmp2;

      SET @sql = CONCAT('SELECT id, datestamp, ', @sql, ' FROM tmp2 GROUP BY id');

      -- SELECT @sql;   

      PREPARE stmt FROM @sql;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;  

UPDATE 1. COMMENTS TO ANSWER 1: Results from original @SQL:

`SET @sql = CONCAT('SELECT id, datestamp, ', @sql, ' FROM tmp2 GROUP BY id');`


SELECT id, datestamp, MAX(IF(question = '1. Our records show that you got care from the provider named below in the last 6 months. {Provider}.  Is that right?', answer, NULL)) 
   AS '1. Our records show that you got care from the provider named below in the last 6 months. {Provider}.  Is that right?',
   MAX(IF(question = '2. Is this the provider you usually see if you need a check-up, want advice about a health problem, or get sick or hurt?', answer, NULL)) 
   AS '2. Is this the provider you usually see if you need a check-up, want advice about a health problem, or get sick or hurt?',
   MAX(IF(question = 'Area', answer, NULL)) AS 'Area',MAX(IF(question = 'Encounter', answer, NULL)) AS 'Encounter' FROM tmp2 GROUP BY id

Results from @SQL:

ERROR: Error Code: 1166. Incorrect column name '1. Our records show that you got care from the provider named below in the last 6 months. {Provider}'

I guess there is a character that it does not like such as the single quotes?

SET @tableName = 'myreport';
SET @sql = CONCAT('CREATE TABLE ', @tableName, ' AS SELECT id, datestamp, ', @sql, ' FROM tmp2 GROUP BY id');


CREATE TABLE myreport AS SELECT id, datestamp, MAX(IF(question = '1. Our records show that you got care from the provider named below in the last 6 months. {Provider}.  Is that right?', answer, NULL)) 
   AS '1. Our records show that you got care from the provider named below in the last 6 months. {Provider}.  Is that right?',
   MAX(IF(question = '2. Is this the provider you usually see if you need a check-up, want advice about a health problem, or get sick or hurt?', answer, NULL)) 
   AS '2. Is this the provider you usually see if you need a check-up, want advice about a health problem, or get sick or hurt?',
   MAX(IF(question = 'Area', answer, NULL)) AS 'Area',MAX(IF(question = 'Encounter', answer, NULL)) AS 'Encounter' FROM tmp2 GROUP BY id

UPDATE 2: THIS WORKS!!! THANKS! I have to reduce the length of the column name as shown below. Then I can run the stored procedure twice per day and select * from this table in Dashbuilder.

CREATE TABLE myreport AS SELECT id, datestamp, MAX(IF(question = '1. Our records show that you got care from the provider named below in the last 6 months. {Provider}.  Is that right?', answer, NULL)) 
   AS '1.',
   MAX(IF(question = '2. Is this the provider you usually see if you need a check-up, want advice about a health problem, or get sick or hurt?', answer, NULL)) 
   AS '2.',
   MAX(IF(question = 'Area', answer, NULL)) AS 'Area',MAX(IF(question = 'Encounter', answer, NULL)) AS 'Encounter' FROM tmp2 GROUP BY id

UPDATE 3: This works! Thanks!

   SET @t = CONCAT('DROP TABLE IF EXISTS ', survey_report );
   PREPARE stmt FROM @t;
   EXECUTE stmt;
   DEALLOCATE PREPARE stmt;

   SET @sql = NULL;
   SET SESSION GROUP_CONCAT_MAX_LEN = 1000000;  -- default is 1024
   SELECT
      GROUP_CONCAT(DISTINCT
         CONCAT(  
            'MAX(IF(question = ''', REPLACE(question,"'", "\\'"), ''', answer, NULL)) AS ''', REPLACE(udf_clean_column_name(15, udf_remove_tags(question)),"'", "\\'"), ''''
         )
      ) INTO @sql
      FROM tmp2;

      SET @sql = CONCAT('CREATE TABLE ', survey_report, ' AS SELECT id, datestamp, ipaddr, ', @sql, ' FROM tmp2 GROUP BY id');

      -- SELECT @sql;

      PREPARE stmt FROM @sql;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;   

   DROP TEMPORARY TABLE IF EXISTS `survey_lookup`;
   DROP TEMPORARY TABLE IF EXISTS `tmp`;
   DROP TEMPORARY TABLE IF EXISTS `tmp2`;

Mysql Function to remove spaces, etc. from the column names.

CREATE FUNCTION `udf_clean_column_name`(col_name_len INT, str varchar(200)) RETURNS varchar(200)
    BEGIN
       SET str = SUBSTRING(str,1,col_name_len);
       SET str = TRIM(str);
       SET str = Replace(str,' ','_');
       SET str = Replace(str,'-','');
       SET str = Replace(str,'?','');
       SET str = Replace(str,',','');
       SET str = Replace(str,'.','');
       RETURN str;
    END;

Mysql function to remove tags (I don't recall where I got this function).

CREATE FUNCTION `udf_remove_tags`(Dirty varchar(4000))
RETURNS varchar(4000)
    DETERMINISTIC
    BEGIN
      DECLARE iStart, iEnd, iLength int;
        WHILE Locate( '<', Dirty ) > 0 And Locate( '>', Dirty, Locate( '<', Dirty )) > 0 DO
          BEGIN
            SET iStart = Locate( '<', Dirty ), iEnd = Locate( '>', Dirty, Locate('<', Dirty ));
            SET iLength = ( iEnd - iStart) + 1;
            IF iLength > 0 THEN
              BEGIN
                SET Dirty = Insert( Dirty, iStart, iLength, '');
                set Dirty = Replace(Dirty,'&nbsp;',''); #No space between & and nbsp;
                set Dirty = Replace(Dirty,'\r','');
                set Dirty = Replace(Dirty,'\n','');
              END;
            END IF;
          END;
        END WHILE;
        RETURN Dirty;
    END;

I don't see any mention of stored procedures in the UF DashBuilder documentation, so it looks like they don't have a way around this.

You can create a table from a SELECT query. If you omit the column specifications, they'll be derived automatically from the select list of the query.

SET @sql = CONCAT('CREATE TABLE ', tableName, ' AS
    SELECT id, datestamp, ', @sql, ' FROM tmp2 GROUP BY id');
PREPARE stmt FROM @sql
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM