Sorry, you do not have permission to ask a question, You must login to ask a question.

Sorry, you do not have permission to ask a question.

brainchime.com

brainchime.com

brainchime.com Navigation

  • Home
  • About Us
  • Contact Us

Mobile menu

Close
  • Home
  • Categories
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Recent Questions
  • Most Answered
  • Answers
  • No Answers
  • Most Visited
  • Most Voted
  • Random
  1. Asked: October 9, 2024In: SQL

    How to call sql stored procedure with output parameter from within a cl program?

    Admin
    Admin
    Added an answer on October 9, 2024 at 8:39 pm

    I have tried to call the SQL stored procedure with output parameter within a CL program using QZDFMDB2 to run SQL interactively in a CL program and I have succeeded a lot in that. Now, I can call the SQL stored procedure with the output parameter in the CL program, the only drawback that I face is IRead more

    I have tried to call the SQL stored procedure with output parameter within a CL program using QZDFMDB2 to run SQL interactively in a CL program and I have succeeded a lot in that. Now, I can call the SQL stored procedure with the output parameter in the CL program, the only drawback that I face is I am not getting the output parameter value returned in my CL program.

    To call the SQL stored procedure with output parameter in the CL program I have used the, so I created a SQL variable and passed that as a return parameter in the form of a command string to program QZDFMDB2 that allows to run SQL statements in CL program. This makes my first work done i.e. calling a SQL stored procedure in a CL program with output parameters which earlier seemed very difficult or almost impossible. So congrats for this success that we have achieved so far.

    Now, the turn is for receiving the return value in the output parameter which is  SQL variable here. So, it was sad but we are not getting return value from SQL stored procedure in our CL program. So, I decided to use some tricks and tweaks so that I would anyway receive the return value or value returned by the output parameter   SQL stored procedure in my CL program. Let me show you the code and steps that I followed to achieve this:

    1. Create a SQL variable using the CREATE VARIABLE statement from STRSQL.
      create or replace variable out char(1) default ' '
    2. Write a SQL stored procedure that returns the output parameter.
      CREATE OR REPLACE PROCEDURE STORED33(                    
              IN P_NAME CHAR(20),                              
              IN P_GENDER CHAR(1),                             
              OUT SUCCESS CHAR(1)                              
               )                                               
      SPECIFIC STORED33                                        
      BEGIN                                                    
      DECLARE SQLSTATE CHAR(5) DEFAULT ' ';                    
      DECLARE SQLCODE INTEGER DEFAULT 0;                       
                                                               
      DECLARE STMT CHAR(500) DEFAULT ' ';                      
                                                               
      INSERT INTO PF8_D(NAME,GENDER) VALUES(P_NAME,P_GENDER);  
      IF SQLCODE = 0 THEN                                      
        SET SUCCESS = '1';                                     
      SET STMT = 'CREATE OR REPLACE VARIABLE TESTLIB.OUT '  
                 CONCAT 'CHAR(1) DEFAULT ''1''';               
      EXECUTE IMMEDIATE STMT;                                  
      ELSE                                                     
       SET SUCCESS = '0';                                     
      SET STMT = 'CREATE OR REPLACE VARIABLE TESTLIB.OUT ' 
                 CONCAT 'CHAR(1) DEFAULT ''0''';              
      EXECUTE IMMEDIATE STMT;                                 
      END IF;                                                 
      END   

      In the SQL stored procedure code, a few lines are written intentionally such as we are writing create or replace SQL variables and setting their values as 1 or 0 according to SQL code value. Here, the SQL variable works as a return value for my CL program. Please note that SQL variable value is accessible to the same session in which its value is set by default during the create variable statement or SET statement.

    3. Compile the SQL stored procedure using the RUNSQLSTM command.
      RUNSQLSTM SRCFILE(TESTLIB/STOREDPROC) 
                SRCMBR(STORED33)               
                COMMIT(*NONE)                  
                DBGVIEW(*SOURCE)    
    4. Create a view in the qtemp library using the CREATE VIEW statement.
      create or replace view qtemp.rtnval   as (   
      select   testlib.out as                   
      rtn  from sysibm.sysdummy1 ) rcdfmt rtnvalf  
    5. Write a CL program calling SQL stored procedure with the output parameter.
      pgm                                                     
      dcl        var(&cmd) type(*char) len(200)               
      dcl        var(&in1) type(*char) len(20) value('name1') 
      dcl        var(&in2) type(*char) len(1)  value('M')     
      dcl        var(&sqlout) type(*char) len(1)              
      dcl        var(&LIB) type(*char) len(10) +              
                   value('TESTLIB')                        
      DCLF       FILE(rtnval)                                 
                                                              
      CHGVAR     VAR(&CMD) VALUE('create or replace variable +
                   testlib.out char(1) default '' ''')     
      call       pgm(qzdfmdb2) parm((&cmd))                   
                                                              
      CHGVAR     VAR(&CMD) VALUE('CALL +                      
                   testlib.STORED33(''' *CAT &IN1 *TCAT +  
                   ''' , ''' *CAT &IN2 *TCAT ''', ' +         
                   *TCAT &lib *TCAT '.OUT)')                  
      call       pgm(qzdfmdb2) parm((&cmd))   
                      
      RUNSQL     SQL('create or replace view qtemp/rtnval as + 
                   (select testlib.out as rtn from +        
                   sysibm.sysdummy1) rcdfmt rtnvalf') +        
                   COMMIT(*NONE)                               
      RCVF                                                     
      CHGVAR     VAR(&SQLOUT) VALUE(&RTN)    
                        
      return                                                   
      endpgm  

      Please, note that in step 1 we created a SQL variable named OUT in the TESTLIB library so that we can later create a view RTNVAL in qtemp library using that at step 4. For your knowledge as we have declared the view rtnval in my CL program so that I can populate that view with the value that was set by SQL stored procedure in SQL variable (SQL global variable).
      At the beginning of the program, we create an SQL variable out in testlib with a default blank value by passing the create or replace variable statement to the QZDFMDB2 program as a parameter in the string format.
      Then, we call the SQL stored procedure from within the CL program with input and output parameters by first building the &cmd string, and in, we pass the SQL variable instead of any CL program variable. Then we pass it to the QZDFMDB2 program as a parameter to run the SQL stored procedure. Now till this point, we have not received any return value from the SQL stored procedure call using QZDFMDB2. However, within the SQL stored procedure script, we did set the respective success/failure value in the SQL variable globally and now I am ready to receive that in my CL program which would be the actual return value by my SQL stored procedure call.
      So, I selected the global SQL variable value and output it in a view named rtnval, and after that, I just read the view using the RCVF command and evaluated the value from the view column &rtn to the cl program variable &sqlout. Therefore, &sqlout would not contain the return value or the output parameter value that should be returned by the actual SQL stored procedure call within the CL program with the output parameter

    See less
      • 1
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
  2. Asked: October 7, 2024In: SQL

    How to use declare global temporary table statement in RPGLE?

    Admin
    Admin
    Added an answer on October 7, 2024 at 11:32 am

    Declare global temporary table statement defines a temporary table for the current session. The temporary table when declared then it is created in the work file database and its description is not populated in the system catalog files. This global temporary table cannot be shared with other sessionRead more

    Declare global temporary table statement defines a temporary table for the current session. The temporary table when declared then it is created in the work file database and its description is not populated in the system catalog files. This global temporary table cannot be shared with other sessions. Once the session ends, the global temporary table is dropped.

    Sample fully free sqlrpgle program to declare global temporary table.

    **free                                          
    exec sql                                        
     drop table session.gtm1;                       
                                                    
    exec sql                                        
     declare global temporary table session.gtm1 as 
     (select * from pf1) with data;                 
    return;     

    Compiling and running this code will create a file GTM1 in the QTEMP library.
    select * from qtemp.gtm1

    See less
      • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
  3. Asked: October 6, 2024In: SQL

    How to call sql stored procedure in cl program?

    Admin
    Admin
    Added an answer on October 6, 2024 at 7:52 pm

    We can call SQL stored procedure from within the CL program using the QZDFMDB2 program which is the datalink file manager DB2 CLP program present in the QSYS library. pgm dcl var(&cmd) type(*char) len(200) dcl var(&in1) type(*char) len(20) value('test') dcl var(&in2) type(*char) len(1) vRead more

    We can call SQL stored procedure from within the CL program using the QZDFMDB2 program which is the datalink file manager DB2 CLP program present in the QSYS library.

    pgm                                                     
    dcl        var(&cmd) type(*char) len(200)               
    dcl        var(&in1) type(*char) len(20) value('test') 
    dcl        var(&in2) type(*char) len(1)  value('F')                                                                                                                               
                   
    CHGVAR     VAR(&CMD) VALUE('CALL +                      
                 testlib.STORED33B(''' *CAT &IN1 *TCAT +  
                 ''' , ''' *CAT &IN2 *TCAT ''')')                  
    call       pgm(qzdfmdb2) parm((&cmd))   
                      
    return                                                   
    endpgm  

    We need to build the command string which is the SQL stored procedure CALL statement with the required parameter. Later we pass that command string to the program qzdfmdb2 which executes SQL interactively from within the CL program.

    See less
      • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
  4. Asked: October 6, 2024In: SQL

    SQL0469 on calling a SQL procedure containing an INOUT parameter

    Admin
    Admin
    Added an answer on October 6, 2024 at 7:46 pm

    When we call a SQL stored procedure using a constant value instead of a parameter marker (?) sqlcode -469 is returned. You can call a SQL stored procedure by passing a parameter marker in an INOUT parameter like this. call testlib.STORED33A('name1','M','?') However, you cannot even call using a paraRead more

    When we call a SQL stored procedure using a constant value instead of a parameter marker (?) sqlcode -469 is returned.

    You can call a SQL stored procedure by passing a parameter marker in an INOUT parameter like this.

    call testlib.STORED33A('name1','M','?')

    However, you cannot even call using a parameters marker in the STRSQL session on an IBM i machine as the Use of parameter marker, NULL, or UNKNOWN is not valid.

    However, You can call it by passing any value to the OUT or INOUT parameter from the Run SQL script like
    call testlib.STORED33A('name1','M',NULL);
    call testlib.STORED33A('name1','M',' ');
    call testlib.STORED33A('name1','M',5);
    call testlib.STORED33A('name1','M',?);

    You will get the return output.

    [ 26/08/2024, 01:11:27 am ]  Run Selected...
    call testlib.STORED33A('name1','M',NULL)
    Return Code = 0
    Output Parameter #3 (SUCCESS) = 1
    Statement ran successfully   (339 ms)
    
    [ 26/08/2024, 01:14:45 am ]  Run Selected...
    call testlib.STORED33A('name1','M',' ')
    Return Code = 0
    Output Parameter #3 (SUCCESS) = 1
    Statement ran successfully   (294 ms)
    
    [ 26/08/2024, 01:16:55 am ]  Run Selected...
    call testlib.STORED33A('name1','M',5)
    Return Code = 0
    Output Parameter #3 (SUCCESS) = 1
    Statement ran successfully   (295 ms)
    
    [ 26/08/2024, 01:30:05 am ]  Run Selected...
    call testlib.STORED33A('name1','M',?)
    Return Code = 0
    Output Parameter #3 (SUCCESS) = 1
    Statement ran successfully   (293 ms)

    No such issue will occur when you call the SQL stored procedure from the Run SQL Script. This issue will only occur in the STRSQL session. Therefore, to call it from the STRSQL session you first have to create a SQL global variable using CREATE VARIABLE statement like below.

    create variable testlib.sqlout char(1) default ' '

    The variableSQLOUT was created in testlib. It’s an *SRVPGM object type of attribute CLE.

    Now again try to call the SQL stored procedure from the STRSQL session on IBM i but this time passed the SQL global variable for the OUT or INOUT parameter in the procedure as below.

    call testlib.STORED33A('name1','M',testlib.sqlout)

    CALL statement complete. SQL7985 which means Call to procedure STORED33A completed successfully.

    You can check the return value in the SQL global variable as follows:

    select testlib.sqlout from sysibm.sysdummy1

    the output return value in SQL global variable from SQL stored procedure call.

    SQLOUT 
    1 
    See less
      • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
  5. Asked: October 6, 2024In: SQL

    What are the equivalent SQL data types to ile rpg data types?

    Admin
    Admin
    Added an answer on October 6, 2024 at 7:28 pm
    This answer was edited.

    ILE RPG data types mapped to SQL data types: ILE RPG data type Description SQL data type DS Data structure Char Zoned(digits:decimal places) Zoned data Numeric(digits, decimal places) Packed(digits:decimal places) Packed data Decimal(digits, decimal places) Bindec(digits) 2-byte binary with 0 decimaRead more

    ILE RPG data types mapped to SQL data types:

    ILE RPG data type Description SQL data type
    DS Data structure Char
    Zoned(digits:decimal places) Zoned data Numeric(digits, decimal places)
    Packed(digits:decimal places) Packed data Decimal(digits, decimal places)
    Bindec(digits) 2-byte binary with 0 decimal places smallint
    2-byte binary with 0 decimal places 4-byte binary with 0 decimal places Integer
    Int(5) 2-byte integer smallint
    Int(10) 4-byte integer Integer
    Int(20) 8-byte integer Bigint
    Float(4) Short float Float(single precision)
    Float(8) Long float Float(double precision)
    Char(length) Character Char(length)
    Varchar(length) Character varying length Varchar(length)
    Graph(length) Graphic Graphic(length)
    Vargraph(length) Varying graphic Vargraphic(length)
    Ucs2(length) UCS-2 Graphic(length) with ccsid 13488 or ccsid 1200
    Varucs2(length) UCS-2 VarGraphic(length) with ccsid 13488 or ccsid 1200
    Date or Date(format-separator) Date Date Datfmt(format) Datsep(separator)
    Time or Time(format-separator) Time Time Timfmt(format) Timsep(separator)
    Timestamp Timestamp Timestamp
    DS Data structure Char
    CLOB is not supported in RPG. SQLTYPE keyword is used to declare CLOB in the RPG program CLOB
    DBCLOB is not supported in RPG. SQLTYPE keyword is used to declare DBCLOB in the RPG program DBCLOB
    BLOB is not supported in RPG. SQLTYPE keyword is used to declare BLOB in the RPG program BLOB
    BINARY is not supported in RPG. SQLTYPE keyword is used to declare BINARY in the RPG program BINARY
    VARBINARY is not supported in RPG. SQLTYPE keyword is used to declare VARBINARY in the RPG program VARBINARY
    XML is not supported in RPG. SQLTYPE keyword is used to declare XML in the RPG program XML
    ROWID is not supported in RPG. SQLTYPE keyword is used to declare ROWID in the RPG program ROWID
    Result Set Locator is not supported in RPG. SQLTYPE keyword is used to declare the Result Set Locator in the RPG program Result Set Locator
    DATALINK is not supported in RPG. DATALINK
    See less
      • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
  6. Asked: October 6, 2024In: SQL

    How to check for locks on a file or table using SQL?

    Admin
    Admin
    Added an answer on October 6, 2024 at 6:43 pm

    You can check for locks on a file/table using the system catalog view QSYS2.OBJ_LOCK. It can also be called as OBJECT_LOCK_INFO. You can embed the SQL query below in your sqlrpgle program and check for locks on a file/table. select count(*) from qsys2.object_lock_info where system_object_schema = 'TRead more

    You can check for locks on a file/table using the system catalog view QSYS2.OBJ_LOCK. It can also be called as OBJECT_LOCK_INFO. You can embed the SQL query below in your sqlrpgle program and check for locks on a file/table.

    select count(*) from qsys2.object_lock_info 
    where 
    system_object_schema = 'TESTLIB'
    and system_object_name = 'TABLE1' 
    and object_type = '*FILE' 
    and lock_state = '*EXCL'

    In the above SQL query, we are checking locks for files/tables Table1 in the library TESTLIB the important check here is the LOCK_STATE column. Since, when we run the program, it opens all the files and you might get shared locks which is fine for us we need to check for exclusive locks only what has been checked in the above SQL query. You can write the above SQL query in your RPG program like this:

         DlockCnt          S             10i 0 inz
          /free  
           Exec Sql
           select count(*) into :lockCnt from qsys2.object_lock_info 
           where 
           system_object_schema = 'TESTLIB' 
           and system_object_name = 'TABLE1' 
           and object_type = '*FILE' 
           and lock_state = '*EXCL';
    
           If lockCnt > 0;
             // Lock present on file/table
             // Code to handle for Lock situation
             dsply('Lock present on file'); 
             return; 
           endif;
           return;
          /end-free

    To test this code, you can put a lock on the file/table using the ALCOBJ command in one of your IBM i sessions and then you need to run this code on the same file from another session.
    ALCOBJ OBJ((TESTLIB/TABLE1 *FILE *EXCL))

    Later, after your testing, you can remove the exclusive on that same file using the DLCOBJ command.
    DLCOBJ OBJ((TESTLIB/TABLE1 *FILE *EXCL))

    See less
      • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
  7. Asked: October 6, 2024In: SQL

    how to replace hex values in a file field using SQL?

    Admin
    Admin
    Added an answer on October 6, 2024 at 6:25 pm

    You can use this SQL to replace the carriage return and line feed characters (X’0D25′) with spaces (X’4040′). update libname/filename set fieldname = replace(fieldname, X'0D25', X'4040') where fieldname like '%' concat X'0D25' concat '%' Note: Please take a backup of your file before running the updRead more

    You can use this SQL to replace the carriage return and line feed characters (X’0D25′) with spaces (X’4040′).

    update libname/filename
    set fieldname = replace(fieldname, X'0D25', X'4040')
    where fieldname like '%' concat X'0D25' concat '%'

    Note: Please take a backup of your file before running the update to verify your results and in case any issue occurs you may then be able to restore your original file data.

    See less
      • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
  8. Asked: October 6, 2024In: SQL

    Can i download the results as a file using the run sql script option on the ACS software?

    Admin
    Admin
    Added an answer on October 6, 2024 at 4:16 pm

    the Save Results… option is by default disabled and you cannot download those results to an Excel spreadsheet by default because it only loads some rows at a time and you may have to press PAGE DOWN until you get all the data. This is a tedious task. You will see a message like 100 rows retrieved (mRead more

    the Save Results… option is by default disabled and you cannot download those results to an Excel spreadsheet by default because it only loads some rows at a time and you may have to press PAGE DOWN until you get all the data. This is a tedious task. You will see a message like 100 rows retrieved (more data available) on the bottom left corner of the Run SQL Script screen. You can enable the Save Results… option in a few steps that allow you to download the SQL result in an Excel spreadsheet using ACS Run SQL Script.

    1. Enable the Save Results… option that appears on Right-click on the SQL Result area which allows you to download data to Excel spreadsheets. For this, go to the Edit section in the top left corner click on that and that starts showing further options under the Edit section. Now click on the Preferences option under the Edit section. This will open the Preferences screen. Under the General Tab and below the New Connections heading check the Enable Saving of results option checkbox and click on Apply and OK.
    2. It will prompt a dialog saying Preferences Saved. The settings for the current connection differ from those specified for new connections. Do you want to apply these settings on the current connection? Click on Yes.
    3. Close the Run SQL script window and open it again. Run the SQL query again. That SQL query only fetched some rows of the table and more data is available to be loaded. So, please click on the little box in the bottom right corner of the Run SQL Script window to retrieve all rows.
    4. Since you have reopened the Run SQL Script and also ran the SQL query you will now see a download option named Save Results… is enabled under the Right click menu on the results area.
    5. Click on the Save Results… download option and download these SQL results as an Excel spreadsheet.
      Note: You can download results in other file formats as well such as .txt, .csv, .ods, .dsr, and tab-delimited text format.
    6. Once you click OK, the Excel spreadsheet file is downloaded/saved to the specified location, and an Inquiry message dialog box appears mentioning file has been saved successfully Would you like to open it. Click Yes to open the downloaded Excel spreadsheet file from the ACS Run SQL Script utility.
    See less
      • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
  9. Asked: October 6, 2024In: SQL

    How can i derive the week from a YYYYMMDD formatted date?

    Admin
    Admin
    Added an answer on October 6, 2024 at 3:03 pm

    We can extract the week from a YYYYMMDD formatted date using the week() function and substr() function. Please use the below SQL query to achieve this. select week(substr(char(datefield),1,4) concat '-' concat substr(char(datefield),5,2) concat '-' concat substr(char(datefield),7,2)) as weeknumber fRead more

    We can extract the week from a YYYYMMDD formatted date using the week() function and substr() function. Please use the below SQL query to achieve this.

    select week(substr(char(datefield),1,4) concat '-' concat
                substr(char(datefield),5,2) concat '-' concat
                substr(char(datefield),7,2)) as weeknumber
    from libraryname/filename

    or you can simply run the SQL query to test one of the values using a dummy table.

    select week(substr(char(20240909),1,4) concat '-' concat
                substr(char(20240909),5,2) concat '-' concat
                substr(char(20240909),7,2)) as weeknumber
    from sysibm.sysdummy1

    The output week is 37.

    See less
      • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
  10. Asked: October 6, 2024In: SQL

    How can i access system36 files using SQL?

    Admin
    Admin
    Added an answer on October 6, 2024 at 12:22 pm
    This answer was edited.

    Because there is no external description for system36 files. Thus, all of that data is contained in a single field when you access the file in SQL. Therefore, when you want to use SQL to access data from a system36 file you need to substring the data you want from the field. For Example, if the SystRead more

    Because there is no external description for system36 files. Thus, all of that data is contained in a single field when you access the file in SQL. Therefore, when you want to use SQL to access data from a system36 file you need to substring the data you want from the field.

    For Example, if the System36 file name is FILE1, and its single field is FLD1 then you can use the below SQL to get data from system36 files, You can change substring positions at your end as per your system36 file.

    Select substr(fld1, 5, 4), substr(fld1,10,5) from FILE1
    where substr(fld1,1,4) = 'A001'

    Please note that you can get the field name of the system6 file by typing SQL select * from file1 and taking F4 to prompt the SQL query and then prompt the select fields.

    See less
      • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
1 2

Sidebar

Statistics

  • Questions 143
  • Answers 177
  • Comments 0
  • Popular
  • Answers
  • Admin

    Why do we use OVERLAY keyword in data structure subfields ...

    • 12 Answers
  • Admin

    How to call sql stored procedure with output parameter from ...

    • 6 Answers
  • Admin

    How to use declare global temporary table statement in RPGLE?

    • 5 Answers
  • Admin
    Admin added an answer CPF4131 is a record format level check error. This indicates… October 18, 2024 at 1:58 am
  • Admin
    Admin added an answer To open the command prompt with administrator rights you can… October 17, 2024 at 12:27 am
  • Admin
    Admin added an answer In AS400, "AS" stands for Application system. This article discusses… October 13, 2024 at 12:49 pm

Trending Tags

.htaccess (1) as400 (123) bing-webmaster (2) control-language (12) db2 (33) ftp (8) google-adsense (1) google-search-console (3) https-redirect (1) iasp (4) ifs (22) jar (4) operations (3) php-my-admin (1) qshell (3) robots.txt (4) rpg (26) stored-procedure (3) stroed procedure (1) triggers (1) yoast (4)

Explore

  • Home
  • Categories
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags

Footer

BrainChime

BrainChime is a blog that posts question-and-answer-based format articles on diverse topics and engages in discussions by allowing people to provide answers/comments without the need to register and log in.

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Terms of Use
  • Privacy Policy
  • Cookie Policy

Help

  • FAQs
  • Categories
  • Tags

© 2024 BrainChime. All Rights Reserved
by BrainChime.