Qual SQL simples dá pra usar local que não fuja muito do padrão

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20541
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 2 vezes

Qual SQL simples dá pra usar local que não fuja muito do padrão

Mensagem por JoséQuintas »

Tô querendo usar algum banco SQL pra testes, mas de preferência sem precisar instalar nada.
Tem algum ainda assim ?
SQLite depende de odbc....
ADS depende de odbc...
MySQL depende de servidor....
Access mesmo talvez ?
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3172
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil
Curtiram: 5 vezes

Re: Qual SQL simples dá pra usar local que não fuja muito do padrão

Mensagem por alxsts »

Olá!

Segundo o Gemini, existem algumas opções online:
Existem excelentes opções de RDBMS online para testar comandos e consultas sem precisar instalar nada, sendo as melhores alternativas: DB Fiddle, SQL Fiddle, e Oracle Live SQL.

Principais Plataformas Online

DB Fiddle: Suporta MySQL, PostgreSQL e SQLite de forma simples e rápida no navegador.
DB Fiddle - SQL Database Playground htt ... iddle.com/

SQL Fiddle: Ideal para testar, comparar e compartilhar esquemas e consultas entre diferentes SGBDs relacionais.
SQL Fiddle - Online SQL Compiler for le ... 2sVX5mkaXx

Oracle Live SQL: Um ambiente completo e gratuito fornecido pela Oracle para rodar comandos avançados e PL/SQL direto na nuvem. Tem opções de aplicação de Inteligência Artificial.
Oracle AI Database Free | Oracle https: ... ZVcHnzO0QS

W3Schools SQL Editor:
Muito fácil de usar para iniciantes que desejam testar comandos SQL básicos de forma imediata.

[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20541
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 2 vezes

Re: Qual SQL simples dá pra usar local que não fuja muito do padrão

Mensagem por JoséQuintas »

Corrigindo:
É pra testar outras coisas, e não o SQL.
Digamos que seja pra testar o aplicativo sem um SQL pesado.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8178
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 6 vezes
Curtiram: 1 vez

Re: Qual SQL simples dá pra usar local que não fuja muito do padrão

Mensagem por Itamar M. Lins Jr. »

Olá!
SQLITE sem ODBC, sem nada.

Código: Selecionar todos

itamar@itamar-I7:~/dev/hb32/contrib/hbsqlit3/tests$ hbmk2 demo.prg 
hbmk2: Processando script local: hbmk.hbm
Harbour 3.2.0dev (r2602281433)
Copyright (c) 1999-2025, https://harbour.github.io/
Compiling 'demo.prg'...
Lines 455, Functions/Procedures 3
Generating C source output to '/tmp/hbmk_6aw7lo.dir/demo.c'... Done.
itamar@itamar-I7:~/dev/hb32/contrib/hbsqlit3/tests$ ./demo 
   
3.44.2                                                                                                                                                               
CREATE TABLE t1 - Ok
BEGIN TRANSACTION   
INSERT INTO t1( name, age ) VALUES( 'Bob', 52 )
INSERT INTO t1( name, age ) VALUES( 'Fred', 40 )
INSERT INTO t1( name, age ) VALUES( 'Sasha', 25 )
INSERT INTO t1( name, age ) VALUES( 'Ivet', 28 ) 
COMMIT                                          
The number of database rows that were changed: 1
Total changes: 4                                
INSERT INTO t1( name, age ) VALUES( 'Andy', 17 ) - Done
INSERT INTO t1( name, age ) VALUES( 'Mary', 19 ) - Done
The number of database rows that were changed: 1       
Total changes: 6                                
Last _ROWID_:          6
                        

SELECT * FROM t1 WHERE name == 'Andy'
Record #          1                  
Column name :      
Column type : SQLITE_NULL
Column value: NULL       
Column name : id  
Column type : SQLITE_INTEGER
Column value:          5    
Column name : name      
Column type : SQLITE_TEXT
Column value: Andy       
Total records -          1
                          
SELECT * FROM t1 WHERE age >= 40
Record #          1             
Column name : id   
Column type : SQLITE_INTEGER
Column value:          1    
Column name : name      
Column type : SQLITE_TEXT
Column value: Bob        
Column name : age
Column type : SQLITE_INTEGER
Column value:         52    
Record #          2     
Column name : id   
Column type : SQLITE_INTEGER
Column value:          2    
Column name : name      
Column type : SQLITE_TEXT
Column value: Fred       
Column name : age 
Column type : SQLITE_INTEGER
Column value:         40    
Total records -          2
                          
SELECT id, name, age + 5 FROM t1
id                              
name
age + 5
SQLITE_NULL
SQLITE_NULL
SQLITE_NULL
INTEGER    
TEXT   
    

sqlite3_get_table
name  age        
Andy  17 
Mary  19
itamar@itamar-I7:~/dev/hb32/contrib/hbsqlit3/tests$ 
O programa demo.prg

Código: Selecionar todos

/*
 * SQLite3 Demo
 *
 * Copyright 2007 P.Chornyj <myorg63@mail.ru>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file LICENSE.txt.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301 USA (or visit https://www.gnu.org/licenses/).
 *
 * As a special exception, the Harbour Project gives permission for
 * additional uses of the text contained in its release of Harbour.
 *
 * The exception is that, if you link the Harbour libraries with other
 * files to produce an executable, this does not by itself cause the
 * resulting executable to be covered by the GNU General Public License.
 * Your use of that executable is in no way restricted on account of
 * linking the Harbour library code into it.
 *
 * This exception does not however invalidate any other reasons why
 * the executable file might be covered by the GNU General Public License.
 *
 * This exception applies only to the code released by the Harbour
 * Project under the name Harbour.  If you copy code from other
 * Harbour Project or Free Software Foundation releases into a copy of
 * Harbour, as the General Public License permits, the exception does
 * not apply to the code that you add in this way.  To avoid misleading
 * anyone as to the status of such modified files, you must delete
 * this exception notice from them.
 *
 * If you write modifications of your own for Harbour, it is your choice
 * whether to permit this exception to apply to your modifications.
 * If you do not wish that, delete this exception notice.
 *
 */

#require "hbsqlit3"

#include "fileio.ch"

#define TRACE
#define TABLE_SQL "CREATE TABLE t1( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER )"

PROCEDURE Main()

   ? sqlite3_libversion()
   sqlite3_sleep( 3000 )

   IF sqlite3_libversion_number() < 3005001
      RETURN
   ENDIF

   t1()
   t2()

   RETURN

/*
*/
PROCEDURE t1()

   LOCAL lCreateIfNotExist := .F.
   LOCAL db := sqlite3_open( "new.s3db", lCreateIfNotExist )

   IF ! Empty( db )
      sqlite3_exec( db, "DROP TABLE t1" )
   ENDIF

   RETURN

/*
*/
PROCEDURE t2()

   LOCAL lCreateIfNotExist := .T.
   LOCAL db := sqlite3_open( "new.s3db", lCreateIfNotExist )
   LOCAL stmt
   LOCAL nCCount, nCType, nI, nJ
   LOCAL aCType :=  { "SQLITE_INTEGER", "SQLITE_FLOAT", "SQLITE_TEXT", "SQLITE_BLOB", "SQLITE_NULL" }
   LOCAL aTable
#ifdef TRACE
   LOCAL hTraceFile, hProfileFile
#endif

   IF ! Empty( db )

#ifdef TRACE
      IF sqlite3_libversion_number() < 3014000
         sqlite3_profile( db, .T. )
         sqlite3_trace( db, .T. )
      ELSE
         hTraceFile := FOpen( "hbsq3_tr.log", FO_READWRITE + HB_FO_CREAT )
         FSeek( hTraceFile, 0, FS_END )
         hProfileFile := FOpen( "hbsq3_pr.log", FO_READWRITE + HB_FO_CREAT )
         FSeek( hProfileFile, 0, FS_END )
         sqlite3_trace_v2( db, SQLITE_TRACE_STMT + SQLITE_TRACE_PROFILE, {| nMask, pStmt, x |
            IF nMask == SQLITE_TRACE_STMT
               IF hb_LeftEq( x, "--" )
                  FWrite( hTraceFile, x + hb_eol() )
               ELSE
                  FWrite( hTraceFile, sqlite3_expanded_sql( pStmt ) + hb_eol() )
               ENDIF
            ELSEIF nMask == SQLITE_TRACE_PROFILE
               FWrite( hProfileFile, sqlite3_expanded_sql( pStmt ) + " - " + hb_NToS( x ) + hb_eol() )
            ENDIF
            RETURN 0
         } )
      ENDIF
#endif
      sqlite3_exec( db, "PRAGMA auto_vacuum=0" )
      sqlite3_exec( db, "PRAGMA page_size=4096" )

      IF sqlite3_exec( db, TABLE_SQL ) == SQLITE_OK
         ? "CREATE TABLE t1 - Ok"
      ENDIF

      sqlite3_exec( db, ;
         "BEGIN TRANSACTION;" + ;
         "INSERT INTO t1( name, age ) VALUES( 'Bob', 52 );" + ;
         "INSERT INTO t1( name, age ) VALUES( 'Fred', 40 );" + ;
         "INSERT INTO t1( name, age ) VALUES( 'Sasha', 25 );" + ;
         "INSERT INTO t1( name, age ) VALUES( 'Ivet', 28 );" + ;
         "COMMIT;" )

      ? "BEGIN TRANSACTION"
      ? "INSERT INTO t1( name, age ) VALUES( 'Bob', 52 )"
      ? "INSERT INTO t1( name, age ) VALUES( 'Fred', 40 )"
      ? "INSERT INTO t1( name, age ) VALUES( 'Sasha', 25 )"
      ? "INSERT INTO t1( name, age ) VALUES( 'Ivet', 28 )"
      ? "COMMIT"

      ? "The number of database rows that were changed: " + hb_ntos( sqlite3_changes( db ) )
      ? "Total changes: " + hb_ntos( sqlite3_total_changes( db ) )

      sqlite3_sleep( 3000 )

      stmt := sqlite3_prepare( db, "INSERT INTO t1( name, age ) VALUES( :name, :age )" )
      IF ! Empty( stmt )
         IF sqlite3_bind_text( stmt, 1, "Andy" ) == SQLITE_OK .AND. ;
            sqlite3_bind_int( stmt, 2, 17 ) == SQLITE_OK
            IF sqlite3_step( stmt ) == SQLITE_DONE
               ? "INSERT INTO t1( name, age ) VALUES( 'Andy', 17 ) - Done"
            ENDIF
         ENDIF
         sqlite3_reset( stmt )

         IF sqlite3_bind_text( stmt, 1, "Mary" ) == SQLITE_OK .AND. ;
            sqlite3_bind_int( stmt, 2, 19 ) == SQLITE_OK
            IF sqlite3_step( stmt ) == SQLITE_DONE
               ? "INSERT INTO t1( name, age ) VALUES( 'Mary', 19 ) - Done"
            ENDIF
         ENDIF
         sqlite3_clear_bindings( stmt )
         sqlite3_finalize( stmt )
      ENDIF

      ? "The number of database rows that were changed: " + hb_ntos( sqlite3_changes( db ) )
      ? "Total changes: " + hb_ntos( sqlite3_total_changes( db ) )
      ? "Last _ROWID_: " + Str( sqlite3_last_insert_rowid( db ) )
      ? ""

      stmt := sqlite3_prepare( db, "SELECT * FROM t1 WHERE name == :name " )
      sqlite3_bind_text( stmt, 1, "Andy" )

      ?
      ? "SELECT * FROM t1 WHERE name == 'Andy'"
      nJ := 0

      DO WHILE sqlite3_step( stmt ) == SQLITE_ROW
         nCCount := sqlite3_column_count( stmt )
         ++nJ
         ? "Record # " + Str( nJ )

         IF nCCount > 0
            FOR nI := 0 TO nCCount - 1
               nCType := sqlite3_column_type( stmt, nI )
               ? "Column name : " + sqlite3_column_name( stmt, nI )
               ? "Column type : " + aCType[ nCType ]
               ? "Column value: "

               SWITCH nCType
               CASE SQLITE_BLOB
                  ?? "BLOB" // sqlite3_column_blob( stmt, nI )
                  EXIT

               CASE SQLITE_INTEGER
                  ?? Str( sqlite3_column_int( stmt, nI ) )
                  EXIT

               CASE SQLITE_NULL
                  ?? "NULL"
                  EXIT

               CASE SQLITE_TEXT
                  ?? sqlite3_column_text( stmt, nI )
                  EXIT
               ENDSWITCH

            NEXT
         ENDIF
      ENDDO
      ? "Total records - " + Str( nJ )

      sqlite3_clear_bindings( stmt )
      sqlite3_finalize( stmt )

      sqlite3_sleep( 3000 )

      stmt := sqlite3_prepare( db, "SELECT * FROM t1 WHERE age >= ?5" )
      sqlite3_bind_int( stmt, 5, 40 )

      ?
      ? "SELECT * FROM t1 WHERE age >= 40 "
      nJ := 0
      DO WHILE sqlite3_step( stmt ) == SQLITE_ROW
         nCCount := sqlite3_column_count( stmt )
         ++nJ
         ? "Record # " + Str( nJ )

         IF nCCount > 0
            FOR nI := 1 TO nCCount
               nCType := sqlite3_column_type( stmt, nI )
               ? "Column name : " + sqlite3_column_name( stmt, nI )
               ? "Column type : " + aCType[ nCType ]
               ? "Column value: "

               SWITCH nCType
               CASE SQLITE_BLOB
                  ?? "BLOB" // sqlite3_column_blob( stmt, nI )
                  EXIT

               CASE SQLITE_INTEGER
                  ?? Str( sqlite3_column_int( stmt, nI ) )
                  EXIT

               CASE SQLITE_NULL
                  ?? "NULL"
                  EXIT

               CASE SQLITE_TEXT
                  ?? sqlite3_column_text( stmt, nI )
                  EXIT
               ENDSWITCH

            NEXT
         ENDIF
      ENDDO
      ? "Total records - " + Str( nJ )
      sqlite3_clear_bindings( stmt )
      sqlite3_finalize( stmt )

      sqlite3_sleep( 3000 )

      ?
      ? "SELECT id, name, age + 5 FROM t1"
      stmt := sqlite3_prepare( db, "SELECT id, name, age + 5 FROM t1" )

      ? sqlite3_column_name( stmt, 1 )
      ? sqlite3_column_name( stmt, 2 )
      ? sqlite3_column_name( stmt, 3 )

      ? aCType[ sqlite3_column_type( stmt, 1 ) ]
      ? aCType[ sqlite3_column_type( stmt, 2 ) ]
      ? aCType[ sqlite3_column_type( stmt, 3 ) ]

      ? sqlite3_column_decltype( stmt, 1 )
      ? sqlite3_column_decltype( stmt, 2 )
      ? sqlite3_column_decltype( stmt, 3 )

      sqlite3_finalize( stmt )

      sqlite3_sleep( 3000 )

      ?
      ? "sqlite3_get_table"
      ?
      aTable := sqlite3_get_table( db, "SELECT name, age  FROM t1 WHERE age BETWEEN 10 AND 20" )
      FOR nI := 1 TO Len( aTable )
         FOR nJ := 1 TO Len( aTable[ nI ] )
            ?? aTable[ nI ][ nJ ], " "
         NEXT
         ?
      NEXT

      sqlite3_sleep( 3000 )
   ENDIF

   RETURN
   
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8178
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 6 vezes
Curtiram: 1 vez

Re: Qual SQL simples dá pra usar local que não fuja muito do padrão

Mensagem por Itamar M. Lins Jr. »

Olá!
Com SQLMIX + SQLITE. Sem nada tudo nativo do Harbour mesmo.
Atenção, tive que adicionar #include "dbinfo.ch" no exemplo que estava faltando.
Exemplo na pasta -> contrib/sddsqlt3/tests/test.prg do Harbour.

Código: Selecionar todos

#require "rddsql"
#require "sddsqlt3"

#include "simpleio.ch"
#include "dbinfo.ch"

REQUEST SDDSQLITE3, SQLMIX

PROCEDURE Main()

   LOCAL tmp

#if defined( __HBSCRIPT__HBSHELL )
   rddRegister( "SQLBASE" )
   rddRegister( "SQLMIX" )
   hb_SDDSQLITE3_Register()
#endif

   Set( _SET_DATEFORMAT, "yyyy-mm-dd" )

   rddSetDefault( "SQLMIX" )

   AEval( rddList(), {| X | QOut( X ) } )

   ? "-1-"
   ? "Connect:", tmp := rddInfo( RDDI_CONNECT, { "SQLITE3", hb_DirBase() + "test.sqlite3" } )
   IF tmp == 0
      ? "Unable connect to the server"
   ENDIF
   ? "-2-"
   ? "Use:", dbUseArea( .T., , "select * from t1", "t1" )
   ? "-3-"
   ? "Alias:", Alias()
   ? "-4-"
   ? "DB struct:", hb_ValToExp( dbStruct() )
   ? "-5-"
   FOR tmp := 1 TO FCount()
      ? FieldName( tmp ), hb_FieldType( tmp )
   NEXT
   ? "-6-"
   Inkey( 0 )
   Browse()

   INDEX ON FIELD->AGE TO age
   dbGoTop()
   Browse()
   dbCloseArea()

   RETURN
O arquivo test.sqlite3 -. Está na pasta contrib/sddsqlt3/tests do Harbour
Captura_de_tela_20260730_225248.png
Captura_de_tela_20260730_225248.png (18.4 KiB) Exibido 36 vezes
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20541
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 2 vezes

Re: Qual SQL simples dá pra usar local que não fuja muito do padrão

Mensagem por JoséQuintas »

Acho que não pensei direito, parece que alternativas só vão criar mais trabalho.
As particularidades de cada banco de dados acabam destruindo a possibilidade de padronizar.
Vou pensar mais sobre como vou querer resolver por aqui.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder