Página 1 de 1

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

Enviado: 30 Jul 2026 16:11
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 ?

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

Enviado: 30 Jul 2026 22:06
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.


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

Enviado: 30 Jul 2026 22:18
por JoséQuintas
Corrigindo:
É pra testar outras coisas, e não o SQL.
Digamos que seja pra testar o aplicativo sem um SQL pesado.

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

Enviado: 30 Jul 2026 22:35
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
   

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

Enviado: 30 Jul 2026 22:53
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 41 vezes

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

Enviado: 31 Jul 2026 14:30
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.